Sebelum kita mulai, mari kita ingatkan bahwa titik asal adalah sudut kiri CGPoint
atas tampilan. Suatu hal penting untuk dipahami tentang pandangan dan orang tua.
Mari kita lihat kode sederhana ini, pengontrol tampilan yang menambah tampilan kotak hitam:
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()
}
}
Ini akan membuat tampilan ini: asal dan pusat persegi panjang hitam tidak cocok dengan koordinat yang sama seperti orang tuanya
Sekarang mari kita coba menambahkan subView SubSubView lain, dan memberikan subSubview asal yang sama dengan subView, tetapi buat subSubView tampilan anak dari subView
Kami akan menambahkan kode ini:
var subSubView = UIView();
subSubView.frame.origin = subView.frame.origin;
subSubView.frame.size = CGSizeMake(20, 20);
subSubView.backgroundColor = UIColor.purpleColor()
subView.addSubview(subSubView)
Dan inilah hasilnya:
Karena baris ini:
subSubView.frame.origin = subView.frame.origin;
Anda mengharapkan asal persegi ungu untuk sama dengan orang tuanya (persegi panjang hitam) tetapi berada di bawahnya, dan mengapa begitu? Karena ketika Anda menambahkan tampilan ke tampilan lain, frame subView "dunia" sekarang adalah parent BOUND RECTANGLE, jika Anda memiliki pandangan bahwa itu asalnya pada layar utama adalah pada coords (15,15) untuk semua sub tampilan itu, sudut kiri atas adalah (0,0)
Inilah sebabnya mengapa Anda harus selalu merujuk ke induk dengan persegi panjang terikat itu, yang merupakan "dunia" dari subViews itu, mari perbaiki baris ini ke:
subSubView.frame.origin = subView.bounds.origin;
Dan lihat keajaibannya, subSubview sekarang terletak persis di asal orangtuanya:
Jadi, Anda suka, "Saya hanya ingin memusatkan pandangan saya dengan pandangan orang tua saya, apa masalahnya?" baik, itu bukan masalah besar, Anda hanya perlu "menerjemahkan" titik pusat induk yang diambil dari bingkai itu ke pusat batas induk dengan melakukan ini:
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
Anda sebenarnya mengatakan kepadanya "bawa pusat tampilan orang tua, dan ubah menjadi dunia subSubView".
Dan Anda akan mendapatkan hasil ini: