Trước khi bắt đầu, chúng ta hãy nhắc rằng điểm gốc là góc trên bên trái CGPoint
của chế độ xem. Một điều quan trọng để hiểu về quan điểm và cha mẹ.
Hãy xem mã đơn giản này, một bộ điều khiển chế độ xem thêm vào nó xem hình vuông màu đen:
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()
}
}
Điều này sẽ tạo ra khung nhìn này: gốc và tâm hình chữ nhật màu đen không khớp với tọa độ giống như cha mẹ của nó
Bây giờ, hãy thử thêm subView khác SubSubView và cung cấp subSubview cùng nguồn gốc với subView, nhưng làm cho subSubView thành một khung nhìn con của subView
Chúng tôi sẽ thêm mã này:
var subSubView = UIView();
subSubView.frame.origin = subView.frame.origin;
subSubView.frame.size = CGSizeMake(20, 20);
subSubView.backgroundColor = UIColor.purpleColor()
subView.addSubview(subSubView)
Và đây là kết quả:
Vì dòng này:
subSubView.frame.origin = subView.frame.origin;
Bạn mong đợi nguồn gốc của hình chữ nhật màu tím giống như cha mẹ của nó (hình chữ nhật màu đen) nhưng nó nằm dưới nó, và tại sao vậy? Bởi vì khi bạn thêm chế độ xem vào chế độ xem khác, "thế giới" của khung nhìn phụ giờ đây là chế độ cha mẹ BOUND RECTANGLE, nếu bạn có chế độ xem trên màn hình chính ở chế độ coords (15,15) cho tất cả các chế độ xem phụ, thì góc trên bên trái sẽ là (0,0)
Đây là lý do tại sao bạn cần luôn luôn đề cập đến cha mẹ bởi hình chữ nhật bị ràng buộc, đó là "thế giới" của các khung nhìn phụ, cho phép sửa dòng này thành:
subSubView.frame.origin = subView.bounds.origin;
Và hãy xem điều kỳ diệu, subSubview hiện được đặt chính xác trong nguồn gốc của nó:
Vì vậy, bạn thích "ok tôi chỉ muốn tập trung vào quan điểm của mình theo quan điểm của bố mẹ tôi, chuyện lớn là gì?" tốt, nó không phải là vấn đề lớn, bạn chỉ cần "dịch" điểm Trung tâm mẹ được lấy từ khung của nó sang trung tâm giới hạn của cha mẹ bằng cách thực hiện điều này:
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
Bạn đang thực sự nói với anh ấy "đưa cha mẹ xem trung tâm và chuyển đổi nó thành thế giới subSubView".
Và bạn sẽ nhận được kết quả này: