Vì câu hỏi tôi đã hỏi nhiều lần nên tôi sẽ cung cấp câu trả lời chi tiết về nó. Hãy sửa đổi nó nếu bạn muốn thêm nội dung chính xác hơn.
Đầu tiên một bản tóm tắt về câu hỏi: khung, giới hạn và trung tâm và các mối quan hệ của họ.
Khung A view frame
( CGRect
) là vị trí của hình chữ nhật trong superview
hệ tọa độ của nó. Theo mặc định, nó bắt đầu ở trên cùng bên trái.
Giới hạn Một khung nhìn bounds
( CGRect
) biểu thị hình chữ nhật khung nhìn trong hệ tọa độ của chính nó.
Trung tâm A center
được CGPoint
biểu thị dưới dạng superview
hệ tọa độ và nó xác định vị trí của điểm trung tâm chính xác của chế độ xem.
Lấy từ vị trí UIView +, đây là các mối quan hệ (chúng không hoạt động theo mã vì chúng là các phương trình không chính thức) trong số các thuộc tính trước đó:
LƯU Ý: Các mối quan hệ này không áp dụng nếu các chế độ xem được xoay. Để biết thêm thông tin, tôi sẽ đề nghị bạn xem hình ảnh sau đây được lấy từ The Kitchen Drawer dựa trên khóa học Stanford CS193p . Tín dụng vào @Rhubarb .
Sử dụng frame
cho phép bạn định vị lại và / hoặc thay đổi kích thước một khung nhìn trong phạm vi của nó superview
. Thông thường có thể được sử dụng từ một superview
, ví dụ, khi bạn tạo một khung nhìn cụ thể. Ví dụ:
// 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];
Khi bạn cần tọa độ để vẽ bên trong, view
bạn thường tham khảo bounds
. Một ví dụ điển hình có thể là vẽ trong một view
cuộc phỏng vấn dưới dạng một hình nhỏ của cái đầu tiên. Vẽ các cuộc phỏng vấn đòi hỏi phải biết giám bounds
sát. Ví dụ:
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];
Hành vi khác nhau xảy ra khi bạn thay đổi bounds
quan điểm. Ví dụ: nếu bạn thay đổi bounds
size
, các frame
thay đổi (và ngược lại). Sự thay đổi xảy ra xung quanh center
quan điểm. Sử dụng mã dưới đây và xem những gì xảy ra:
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));
Hơn nữa, nếu bạn thay đổi, bounds
origin
bạn thay đổi origin
hệ tọa độ bên trong của nó. Theo mặc định, origin
nó nằm ở (0.0, 0.0)
(góc trên cùng bên trái). Ví dụ: nếu bạn thay đổi origin
cho view1
bạn có thể thấy (nhận xét mã trước đó nếu bạn muốn) bây giờ là góc trên cùng bên trái để view2
chạm vào mã view1
. Động lực khá đơn giản. Bạn nói với view1
rằng góc trái trên của nó bây giờ là ở vị trí (20.0, 20.0)
nhưng vì view2
's frame
origin
bắt đầu từ (20.0, 20.0)
, họ sẽ trùng.
CGRect frame = view1.bounds;
frame.origin.x += 20.0f;
frame.origin.y += 20.0f;
view1.bounds = frame;
Đại origin
diện cho view
vị trí của nó trong vị trí của nó superview
nhưng mô tả vị trí của bounds
trung tâm.
Cuối cùng, bounds
và origin
không phải là khái niệm liên quan. Cả hai đều cho phép xuất phát frame
quan điểm (Xem các phương trình trước).
Nghiên cứu trường hợp của View1
Đây là những gì xảy ra khi sử dụng đoạn mã sau.
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]));
Hình ảnh tương đối.
Điều này thay vì những gì xảy ra nếu tôi thay đổi [self view]
giới hạn như sau.
// previous code here...
CGRect rect = [[self view] bounds];
rect.origin.x += 30.0f;
rect.origin.y += 20.0f;
[[self view] setBounds:rect];
Hình ảnh tương đối.
Ở đây bạn nói [self view]
rằng góc trên cùng bên trái của nó bây giờ nằm ở vị trí (30.0, 20.0) nhưng vì view1
nguồn gốc khung bắt đầu từ (30.0, 20.0), chúng sẽ trùng nhau.
Tài liệu tham khảo bổ sung (để cập nhật với các tài liệu tham khảo khác nếu bạn muốn)
Giới thiệu clipsToBounds
(nguồn Apple doc)
Đặt giá trị này thành CÓ làm cho các cuộc phỏng vấn được cắt bớt trong giới hạn của người nhận. Nếu được đặt thành NO, các khung hình có khung hình vượt ra ngoài giới hạn hiển thị của máy thu sẽ không bị cắt bớt. Giá trị mặc định là không.
Nói cách khác, nếu một khung nhìn frame
là (0, 0, 100, 100)
và khung nhìn của nó là (90, 90, 30, 30)
, bạn sẽ chỉ thấy một phần của khung nhìn đó. Cái sau sẽ không vượt quá giới hạn của quan điểm phụ huynh.
masksToBounds
tương đương với clipsToBounds
. Thay vào đó UIView
, thuộc tính này được áp dụng cho a CALayer
. Dưới mui xe, clipsToBounds
gọi masksToBounds
. Để tham khảo thêm, hãy xem Làm thế nào là mối quan hệ giữa clipToBound của UIView và mặt nạ ToBound của CALay? .