Sorduğum soru birçok kez görüldüğü için ayrıntılı bir cevap vereceğim. Daha doğru içerik eklemek istiyorsanız bunu değiştirmekten çekinmeyin.
İlk olarak soru üzerine bir özet: çerçeve, sınırlar ve merkez ve ilişkileri.
Çerçeve Bir görünümün frame
( CGRect
), dikdörtgenin superview
koordinat sistemindeki konumudur . Varsayılan olarak sol üst kısımdan başlar.
Sınırlar Bir görünümün bounds
( CGRect
) öğesi, kendi koordinat sisteminde bir görünüm dikdörtgenini ifade eder.
Merkez A center
, 'koordinat sistemi' olarak CGPoint
ifade edilir superview
ve görünümün tam merkez noktasının konumunu belirler.
UIView + konumundan alındığında bunlar önceki özellikler arasındaki ilişkilerdir (gayri resmi denklemler oldukları için kodda çalışmazlar):
NOT: Görünümler döndürüldüğünde bu ilişkiler geçerli değildir. Daha fazla bilgi için, Stanford CS193p kursuna dayanan The Kitchen Drawer'dan alınan aşağıdaki resme bir göz atmanızı öneririm . Krediler @Rhubarb'a gider .
Kullanmak, frame
içindeki bir görünümü yeniden konumlandırmanıza ve / veya yeniden boyutlandırmanıza olanak tanır superview
. Genellikle a superview
, örneğin belirli bir alt görünüm oluşturduğunuzda kullanılabilir. Örneğin:
// view1 will be positioned at x = 30, y = 20 starting the top left corner of [self view]
// [self view] could be the view managed by a UIViewController
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(30.0f, 20.0f, 400.0f, 400.0f)];
view1.backgroundColor = [UIColor redColor];
[[self view] addSubview:view1];
İçinde çizim yapmak için koordinatlara ihtiyaç duyduğunuzda view
genellikle bakın bounds
. Tipik bir örnek, view
bir alt görünümde birincinin iç kısmı olarak çizmek olabilir . Alt görünümü çizmek için denetimin bilinmesi gerekir bounds
. Örneğin:
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(50.0f, 50.0f, 400.0f, 400.0f)];
view1.backgroundColor = [UIColor redColor];
UIView* view2 = [[UIView alloc] initWithFrame:CGRectInset(view1.bounds, 20.0f, 20.0f)];
view2.backgroundColor = [UIColor yellowColor];
[view1 addSubview:view2];
bounds
Bir görünümü değiştirdiğinizde farklı davranışlar oluşur . Örneğin, değiştirirseniz bounds
size
, frame
değişiklikler (ve tersi). Değişiklik center
görünümün etrafında gerçekleşir . Aşağıdaki kodu kullanın ve ne olduğunu görün:
NSLog(@"Old Frame %@", NSStringFromCGRect(view2.frame));
NSLog(@"Old Center %@", NSStringFromCGPoint(view2.center));
CGRect frame = view2.bounds;
frame.size.height += 20.0f;
frame.size.width += 20.0f;
view2.bounds = frame;
NSLog(@"New Frame %@", NSStringFromCGRect(view2.frame));
NSLog(@"New Center %@", NSStringFromCGPoint(view2.center));
Değiştirmek Dahası, bounds
origin
değiştirmek origin
iç koordinat sisteminin. Varsayılan origin
olarak (0.0, 0.0)
(en üst köşedir). Örneğin, origin
için öğesini değiştirirseniz, view1
artık sol üst köşenin bu view2
tuşa dokunduğunu görebilirsiniz (isterseniz önceki kodu yorumlayın) view1
. Motivasyon oldukça basit. Sen söylemek view1
üst sol köşesi artık pozisyonda olduğunu (20.0, 20.0)
ancak o zamandan beri view2
bireyin frame
origin
dan başlar (20.0, 20.0)
, bunlar denk gelecek.
CGRect frame = view1.bounds;
frame.origin.x += 20.0f;
frame.origin.y += 20.0f;
view1.bounds = frame;
origin
Temsil eder view
onun içinde pozisyonunu superview
ancak konumunu tarif bounds
merkezi.
Son olarak, bounds
ve origin
ilgili kavramlar değildir. Her ikisi frame
de bir görünümün türetilmesine izin verir (Önceki denklemlere bakınız).
View1'in örnek olay incelemesi
Aşağıdaki kod parçasını kullanırken neler olduğu aşağıda açıklanmıştır.
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(30.0f, 20.0f, 400.0f, 400.0f)];
view1.backgroundColor = [UIColor redColor];
[[self view] addSubview:view1];
NSLog(@"view1's frame is: %@", NSStringFromCGRect([view1 frame]));
NSLog(@"view1's bounds is: %@", NSStringFromCGRect([view1 bounds]));
NSLog(@"view1's center is: %@", NSStringFromCGPoint([view1 center]));
Göreli görüntü.
Bunun yerine [self view]
, aşağıdaki gibi sınırları değiştirirsem ne olur ?
// previous code here...
CGRect rect = [[self view] bounds];
rect.origin.x += 30.0f;
rect.origin.y += 20.0f;
[[self view] setBounds:rect];
Göreli görüntü.
Burada [self view]
sol üst köşesinin şimdi pozisyonda (30.0, 20.0) olduğunu söylüyorsunuz , ancak view1
çerçeve kökeni (30.0, 20.0) 'dan başladığı için çakışıyorlar.
Ek referanslar (isterseniz diğer referanslarla güncellemek için)
Hakkında clipsToBounds
(kaynak Apple doc)
Bu değerin EVET olarak ayarlanması, alt görüntülerin alıcının sınırlarına kırpılmasına neden olur. HAYIR olarak ayarlanırsa, çerçeveleri alıcının görünür sınırlarının ötesine uzanan alt görünümler kırpılmaz. Varsayılan değer hayır.
Bile görünüyor eğer başka deyişle, frame
olup (0, 0, 100, 100)
ve bunun Subview olduğunu (90, 90, 30, 30)
, bu subview sadece bir kısmını göreceksiniz. İkincisi, üst görünümün sınırlarını aşmayacaktır.
masksToBounds
eşittir clipsToBounds
. A yerine UIView
bu özellik a öğesine uygulanır CALayer
. Kaputun altında clipsToBounds
aramalar masksToBounds
. Daha fazla referans için UIView'un clipsToBounds ve CALayer'ın masksToBounds arasındaki ilişki nasıl? .