Başlamadan önce, başlangıç noktasının CGPoint
bir görünümün Sol Üst köşesi olduğunu hatırlatalım . Görüşler ve ebeveynler hakkında anlaşılması gereken önemli bir şey.
Bu basit koda bir göz atalım, görünümüne siyah bir kare ekleyen bir görünüm denetleyicisi:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
createDummyView()
super.view.backgroundColor = UIColor.cyanColor();
}
func createDummyView(){
var subView = UIView(frame: CGRect(x: 15, y: 50, width: 50 , height: 50));
super.view.addSubview(subView);
view.backgroundColor = UIColor.blackColor()
}
}
Bu, şu görünümü oluşturacaktır: siyah dikdörtgenin orijini ve merkezi, üst öğe ile aynı koordinatlara uyuyor
Şimdi, başka bir SubSubView subView eklemeyi ve subSubview ile aynı kaynağı vermeyi deneyelim, ancak subSubView'ı subView'in bir alt görünümü yapalım
Bu kodu ekleyeceğiz:
var subSubView = UIView();
subSubView.frame.origin = subView.frame.origin;
subSubView.frame.size = CGSizeMake(20, 20);
subSubView.backgroundColor = UIColor.purpleColor()
subView.addSubview(subSubView)
Ve sonuç bu:
Bu satır nedeniyle:
subSubView.frame.origin = subView.frame.origin;
Mor dikdörtgenin orijininin ebeveyn (siyah dikdörtgen) ile aynı olmasını bekliyorsunuz, ancak onun altına giriyor ve bu neden? Çünkü başka bir görünüme bir görünüm eklediğinizde, alt Görünüm çerçevesi "dünya" artık ebeveyn BOUND RECTANGLE'tır, ana ekrandaki orijininin tüm alt görünümleri için koordinatlarda (15,15) olduğu görüşüne sahipseniz, sol üst köşe (0,0) olacaktır
Bu nedenle, bir ebeveyne her zaman alt görünümlerinin "dünyası" olan bağlı dikdörtgeniyle başvurmanız gerekir, bu satırı şu şekilde düzeltelim:
subSubView.frame.origin = subView.bounds.origin;
Ve sihri görün, alt görünüm artık tam olarak ana kaynağında bulunuyor:
Öyleyse, "Tamam, sadece ailemin görüşüne göre bakış açımı ortalamak istedim, sorun nedir?" pekala, önemli değil, sadece çerçevesinden alınan üst Merkez noktasını, bunu yaparak ebeveynin sınır merkezine "çevirmeniz" gerekir:
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
Aslında ona "ebeveynlerin merkezini al ve onu subSubView dünyasına dönüştür" diyorsun.
Ve bu sonucu alacaksınız: