2009-07-01 67 views
191

UIView, frame, bounds, center ve origin özelliklerine sahiptir ve bunların hepsi birbiriyle ilişkili görünüyor. Çoğu zaman, UIView'un konumunu ve boyutunu ayarlarken frame ile ilgilenirim. frame'un global koordinat sistemini kullandığını ve bounds'un yerel görünümün koordinatını kullandığını anlıyorum (bu nedenle onun x ve y'si 0'dır, ancak her zaman değil), ancak ne zaman kullanacağım hala bana kafa karıştırıcıdır.UIView'in çerçevesi, sınırları, ortası, kökü ne zaman kullanmalı?

Hangi koşullarda (ve doğru zamanda) diğer özellikler (bounds, center, origin) kullanılmalıdır?

+0

Aşağıdaki bağlantı iyi cevabı vardır. http://stackoverflow.com/questions/5361369/uiview-frame-bounds-and-center – Ohmy

+0

Çerçeve vs Resimlerle sınırlar: http://stackoverflow.com/a/28917673/3681880 – Suragch

cevap

235

Marco'nun cevabı yukarıdaki doğrudur, ama sadece

çerçeve ... "Ne bağlamında" sorusu üzerine genişletmek - bu normaldir iPhone uygulamaları için en sık kullandığınız bir özelliktir. Çoğu kontroller "içeren" kontrole göre düzenlenir, böylece frame.origin doğrudan kontrolün görüntülenmesi gereken yere karşılık gelecektir ve frame.size kontrolün ne kadar büyük olacağını belirleyecektir.

center - Bu, hareketin veya ölçeklemenin meydana gelebileceği hareketli tabanlı oyunlar ve animasyonlar için muhtemelen odaklanacağınız özelliktir. Varsayılan olarak animasyon ve döndürme, UIView'nin merkezine dayalı olacaktır. Bu tür nesneleri çerçeve özelliği ile denemek ve yönetmek nadiren mantıklıdır.

sınırlar - bu özellik bir konumlandırma özelliği değildir, ancak çerçeveye UIView "relative" öğesinin çekilebilir alanını tanımlar. Varsayılan olarak bu özellik genellikle (0, 0, genişlik, yükseklik) 'dir. Bu özelliği değiştirmek, çerçevenin dışına çizmenize veya çerçevedeki daha küçük bir alana çizmeyi kısıtlamanıza izin verecektir. Bunun iyi bir tartışması aşağıdaki linkte bulunabilir. Çizim bölgesini ayarlamak için özel bir ihtiyaç olmadığı sürece bu özelliğin manipüle edilmesi nadirdir. Tek istisna, uygulamaların görünür alanını belirlemek ve başlangıç ​​UIView'in çerçevesini buna göre ayarlamak için çoğu programın başlangıçta [[UIScreen mainScreen] bounds] kullanacağıdır.

Why is there an frame rectangle and an bounds rectangle in an UIView?

Umarım bu her özellik alışması açabilecek durumları açıklığa kavuşturmak yardımcı olur.

+31

Sanırım buna değer Bir görünüm, ona uygulanan bir dönüşüme sahip olduğunda "sınırlar" yaygın olarak kullanılır. Bu koşullar altında 'frame' özelliği tanımsızdır. Diğer cevaplarda da belirtildiği gibi, "merkez" ve "sınırlar" ın değiştirilmesi, sırasıyla görünümün konumunu ve boyutunu değiştirmeye eşdeğerdir. – Stuart

17

center, bounds ve frame birbirine kilitli özellikleri: biri değiştirilirken diğerleri güncelleme, bu yüzden yaparak istediğiniz şekilde kullanacaktır. Örneğin, bir görünümü yeniden görmek için frame x/y paramlarını değiştirmek yerine, center özelliğini güncelleştirmeniz yeterlidir.

35

Bunlar ilgili değerlerdir ve özellik belirleyici/alıcı yöntemleri ile tutarlı bir şekilde korunur (ve gerçek bir örnek değişken tarafından desteklenmeyen çerçevenin tamamen sentezlenmiş bir değer kullanılarak kullanılması).

ana denklemler şunlardır:

(aynıdır)
frame.origin = center - bounds.size/2 

center = frame.origin + bounds.size/2 

(ve orada da) kodu, sadece ifade etmek denklemlerini değil

frame.size = bounds.size 

üç özellik arasındaki değişmez. Bu denklemler ayrıca, görüşünüzün dönüşümü, varsayılan olarak olduğu kimliktir. Eğer değilse, o zaman sınırlar ve merkez aynı anlamı taşır, ancak çerçeve değişebilir. Sağa-açılı olmayan dönüşler yapmadığınız sürece, çerçeve her zaman süper görünümün koordinatları açısından dönüştürülmüş görünüm olacaktır.

Bu malzeme hepsi burada yararlı bir mini kütüphane ile daha ayrıntılı olarak açıklanmıştır:

http://bynomial.com/blog/?p=24