2012-08-31 10 views
10

Tôi đã tạo hai phiên bản UILabel và thêm chúng vào chế độ xem của ViewController. Và sau đó tôi đã thay đổi anchorPoint của mỗi từ 0,5 đến 1,0 (x và y).Tại sao chế độ xem của tôi di chuyển khi tôi đặt khung hình sau khi thay đổi điểm neo của nó?

Tiếp theo, tôi đặt lại khung của uiLabel2 thành khung tôi đã tạo với: (100,100,100,20).

Khi tôi chạy ứng dụng, uiLabel1uiLabel2 hiển thị ở các vị trí khác nhau. Tại sao?

UILabel *uiLabel1 = [[[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 20)] autorelease]; 
uiLabel1.text = @"UILabel1"; 
uiLabel1.layer.anchorPoint = CGPointMake(1, 1); 

UILabel *uiLabel2 = [[[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 20)] autorelease]; 
uiLabel2.text = @"UILabel2"; 
uiLabel2.layer.anchorPoint = CGPointMake(1, 1); 
uiLabel2.frame = CGRectMake(100, 100, 100, 20); 

[self.view addSubview:uiLabel1]; 
[self.view addSubview:uiLabel2]; 

enter image description here

Trả lời

37

Một CALayer có bốn đặc tính xác định vị trí nó xuất hiện trong superlayer của nó:

  • position (mà cũng giống như tài sản center của view)
  • bounds (trên thực tế chỉ có size phần của bounds)
  • anchorPoint
  • transform

Bạn sẽ nhận thấy rằng framekhông một trong các thuộc tính đó. Thuộc tính frame thực sự bắt nguồn từ các thuộc tính đó. Khi bạn đặt thuộc tính frame, lớp thực sự thay đổi centerbounds.size của chúng tôi dựa trên khung bạn cung cấp và lớp hiện tại của anchorPoint.

Bạn tạo lớp đầu tiên (bằng cách tạo ra các UILabel đầu tiên, đó là một lớp con của UIView, và mỗi UIView có một lớp), cho nó một khung 100,100,100,20. Lớp này có một điểm neo mặc định là 0,5,0,5. Vì vậy, nó tính toán giới hạn của nó là 0,0,100,20 và vị trí của nó là 150,110. Nó trông giống như thế này:

anchor at center

Sau đó, bạn thay đổi điểm neo của nó đến 1,1.Vì bạn không thay đổi vị trí hoặc giới hạn của lớp một cách trực tiếp và bạn không thay đổi chúng gián tiếp bằng cách đặt khung của nó, lớp di chuyển sao cho điểm neo mới của nó ở vị trí (không thay đổi) của nó trong siêu lớp:

anchor at corner

Nếu bạn yêu cầu khung của (hoặc chế độ xem) của lớp ngay bây giờ, bạn sẽ nhận được 50,90,100,20.

Khi bạn tạo lớp thứ hai (cho số thứ hai UILabel), sau khi thay đổi điểm neo, bạn đặt khung của nó. Vì vậy, các lớp tính toán một vị trí mới và giới hạn dựa trên khung mà bạn cung cấp và điểm neo hiện tại:

anchor at corner with reset frame

Nếu bạn hỏi lớp (hoặc xem) cho khung của nó bây giờ, bạn sẽ nhận được khung bạn đặt, 100,100,100,20. Nhưng nếu bạn yêu cầu vị trí của nó (hoặc trung tâm của khung nhìn), bạn sẽ nhận được 200.120.

+0

Oh! Rob !. Cảm ơn bạn đã trả lời tuyệt vời và chi tiết của bạn. –

4

Vâng đó là chính xác những gì một điểm neo không. Trước khi thay đổi các điểm neo, bạn đã thiết lập khung dựa trên tâm của nhãn. Sau đó, bạn đang thiết lập khung dựa trên góc dưới cùng bên phải.

Vì bạn chỉ đặt lại khung cho chỉ một nhãn, một khung đã điều chỉnh khung của nó dựa trên điểm neo mới và một khung còn lại ở vị trí cũ.

Nếu bạn muốn chúng ở cùng một điểm, thì bạn cần đặt lại khung cho cả hai sau khi chỉnh sửa điểm neo, HOẶC không có điểm neo nào cả.

This guide giải thích thêm về điểm neo.

+0

Liên kết giải thích và đưa ra của bạn đã giúp ích rất nhiều cho tôi. –

+0

Cảm ơn KDarker. –

+0

Liên kết bị hỏng: ( – Nathaniel