2014-10-02 35 views
10

Tôi có phần tử giao diện người dùng (UISwitch thực sự, nhưng không quan trọng thực sự) có cả không gian đầu và cuối được ghim vào superview trong Trình tạo giao diện. Ràng buộc trông như thế này trong Xcode 6:Bố cục tự động iOS8 được lập trình pin để lề bố cục tương đối

Constraint pin

các hạn chế về không gian hàng đầu là như nhau một cách hiệu quả. Giá trị của ràng buộc là 42.0 điểm.

Đây chính xác là những gì tôi muốn, vì đối với các thiết bị khác nhau tôi có thể thay đổi thuộc tính layoutMargins trên UIView và các ràng buộc sẽ hoạt động chính xác, để tăng biên độ giữa các giao diện.

Bây giờ tôi muốn thêm một chế độ xem khác trong mã cũng có cả khoảng trắng phía trước và cuối được gắn vào lề giám sát của nó, vì vậy, layoutMargins đặt thành superview sẽ hoạt động.

tôi gắn quan điểm sử dụng thị giác ngôn ngữ định dạng với cú pháp sau:

NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-42.0-[separatorView]-42.0-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(self.contentView, separatorView)]; 

[self.contentView addConstraints:constraints]; 
[self.contentView setNeedsUpdateConstraints]; 

này hoạt động, nhưng layoutMargins tài sản không có tác dụng hạn chế này, vì vậy nó được rõ ràng không phải gắn với lề, nhưng trực tiếp để giám sát.

Vì vậy, câu hỏi của tôi là:

Làm thế nào để pin không gian yếu tố giao diện người dùng để lề trong mã sử dụng ngôn ngữ định dạng hình ảnh? Hoặc nếu không thể, cách ghim với constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant: API?

Cảm ơn!

Trả lời

14

Trong iOS8, ngôn ngữ định dạng hình ảnh đã được cập nhật để "| -" hoặc "- |" sẽ mặc định sử dụng khoảng trắng được xác định bởi thuộc tính layoutMargins của superview.

Vì vậy, câu trả lời bằng ngôn ngữ định dạng hình ảnh như sau:

// programmatically set the layoutMargins, only if 
// you want non-default values and they are not already set in IB! 
self.contentView.layoutMargins = UIEdgeInsetsMake(0,42,0,42); // set left and right margins to 42 

// assume: seperatorView is already a subview of self.contentView 

// separatorView will use the constraints because we write "-" between it and the superview edge 
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[separatorView]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(separatorView)]; 
[self.contentView addConstraints:constraints]; 

Nếu bạn muốn tham khảo bên lề bố trí khi tạo những hạn chế qua API trực tiếp, sau đó bạn sử dụng iOS8 mới chỉ thuộc tính bố trí:

NSMutableArray * constraints = [NSMutableArray array]; 
[constraints addObject:[NSLayoutConstraint constraintWithItem:self.contentView 
    attribute:NSLayoutAttributeLeftMargin 
    relatedBy:NSLayoutRelationEqual 
    toItem:separatorView 
    attribute:NSLayoutAttributeLeft 
    multiplier:1.0 
    constant:0]]; 
[constraints addObject:[NSLayoutConstraint constraintWithItem:self.contentView 
    attribute:NSLayoutAttributeRightMargin 
    relatedBy:NSLayoutRelationEqual 
    toItem:separatorView 
    attribute:NSLayoutAttributeRight 
    multiplier:1.0 
    constant:0]]; 
[self.contentView addConstraints:constraints]; 
4

tôi đồng ý, "Trong iOS8, ngôn ngữ định dạng hình ảnh đã được cập nhật để '| -' hoặc '- |'. sẽ mặc định sử dụng một khoảng cách xác định bởi tài sản layoutMargins của superView"

Vì vậy, bạn nên chọn tùy chọn “Hạn chế ở lề” khi bạn sử dụng Trình tạo giao diện để hỗ trợ bố cục của mình. Nếu có, thì nó hoạt động.

Nếu sự cố vẫn chưa được giải quyết, bạn có thể cho tôi một dự án demo không?

Đã thêm: T his article whcih hiển thị cho chúng tôi chức năng bảo quản API ios8 mớiSuperviewLayoutMargins, chúc bạn hữu ích hơn.

Các vấn đề liên quan