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 superviewkoordinat 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 CGPointifade edilir superviewve 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, frameiç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 viewgenellikle bakın bounds. Tipik bir örnek, viewbir 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];
boundsBir görünümü değiştirdiğinizde farklı davranışlar oluşur . Örneğin, değiştirirseniz bounds size, framedeğişiklikler (ve tersi). Değişiklik centergö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 origindeğiştirmek originiç koordinat sisteminin. Varsayılan originolarak (0.0, 0.0)(en üst köşedir). Örneğin, originiçin öğesini değiştirirseniz, view1artık sol üst köşenin bu view2tuş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 view2bireyin frame origindan 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;
originTemsil eder viewonun içinde pozisyonunu superviewancak konumunu tarif boundsmerkezi.
Son olarak, boundsve originilgili kavramlar değildir. Her ikisi framede 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, frameolup (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.
masksToBoundseşittir clipsToBounds. A yerine UIViewbu özellik a öğesine uygulanır CALayer. Kaputun altında clipsToBoundsaramalar masksToBounds. Daha fazla referans için UIView'un clipsToBounds ve CALayer'ın masksToBounds arasındaki ilişki nasıl? .