Khi sử dụng Bố cục Tự động trong mã, việc thiết lập khung không làm gì cả. Vì vậy, việc bạn chỉ định chiều rộng 200 trên khung nhìn ở trên, không có ý nghĩa gì khi bạn đặt các ràng buộc trên đó. Để tập hợp ràng buộc của một chế độ xem là rõ ràng, nó cần bốn điều: vị trí x, vị trí y, chiều rộng và chiều cao cho bất kỳ trạng thái nhất định nào.
Hiện tại trong đoạn mã trên, bạn chỉ có hai (chiều cao, liên quan đến chế độ xem siêu cao và vị trí y, liên quan đến chế độ xem siêu cao). Ngoài ra, bạn có hai ràng buộc bắt buộc có thể xung đột tùy thuộc vào cách thiết lập các ràng buộc của chế độ xem siêu cấp của chế độ xem. Nếu superview có một ràng buộc bắt buộc chỉ định chiều cao của nó là một giá trị nào đó nhỏ hơn 748, bạn sẽ nhận được ngoại lệ "các ràng buộc không thỏa mãn".
Thực tế là bạn đã thiết lập chiều rộng của khung nhìn trước khi thiết lập các ràng buộc chẳng có nghĩa gì. Nó thậm chí sẽ không tính đến khung cũ và sẽ tính toán khung mới dựa trên tất cả các ràng buộc mà nó đã chỉ định cho các khung nhìn đó. Khi xử lý tự động thanh toán trong mã, tôi thường chỉ tạo một chế độ xem mới bằng cách sử dụng initWithFrame:CGRectZero
hoặc đơn giản init
.
Để tạo tập hợp ràng buộc cần thiết cho bố cục mà bạn đã mô tả bằng lời trong câu hỏi của mình, bạn sẽ cần thêm một số ràng buộc ngang để ràng buộc chiều rộng và vị trí x để cung cấp bố cục được chỉ định đầy đủ:
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-[myView(>=748)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:[myView(==200)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
Mô tả bằng lời bố cục này đọc như sau, bắt đầu với ràng buộc dọc:
myView sẽ lấp đầy chiều cao của superview bằng một phần đệm trên và dưới bằng không gian tiêu chuẩn. superview của myView có chiều cao tối thiểu là 748pts. Chiều rộng của myView là 200pts và có phần đệm bên phải bằng không gian tiêu chuẩn so với superview của nó.
Nếu bạn chỉ muốn chế độ xem lấp đầy toàn bộ chiều cao của chế độ xem siêu tốc mà không hạn chế chiều cao của chế độ xem siêu tốc, thì bạn chỉ cần bỏ qua (>=748)
tham số trong văn bản định dạng trực quan. Nếu bạn nghĩ rằng (>=748)
tham số là bắt buộc để cung cấp cho nó chiều cao - thì bạn không làm như vậy trong trường hợp này: ghim chế độ xem vào các cạnh của chế độ xem bằng cách sử dụng cú pháp bar ( |
) hoặc thanh có dấu cách ( |-
, -|
), bạn đang cung cấp cho chế độ xem của mình -position (ghim chế độ xem trên một cạnh) và vị trí y với chiều cao (ghim chế độ xem trên cả hai cạnh), do đó thỏa mãn bộ ràng buộc của bạn cho chế độ xem.
Liên quan đến câu hỏi thứ hai của bạn:
Sử dụng NSDictionaryOfVariableBindings(self.myView)
(nếu bạn đã thiết lập thuộc tính cho myView) và đưa nó vào VFL để sử dụng self.myView
trong văn bản VFL của bạn, bạn có thể sẽ nhận được một ngoại lệ khi autolayout cố gắng phân tích cú pháp văn bản VFL của bạn. Nó liên quan đến ký hiệu dấu chấm trong các khóa từ điển và hệ thống đang cố gắng sử dụng valueForKeyPath:
. Xem ở đây cho một câu hỏi và câu trả lời tương tự .