8

Tôi đã tạo một dự án demo here. Tôi có một cái nhìn mà tôi tạo ra một ScrollView trong một tập tin .xib. Trong trình xây dựng giao diện, tôi không đặt bất kỳ ràng buộc nào. Trong phương pháp viewDidLoad của tôi, tôi thiết lập các ràng buộc với SnapKit:Ngăn Trình tạo giao diện tự động tạo các ràng buộc?

scrollView.snp_makeConstraints { (make) -> Void in 
    make.edges.equalTo(self.view) 
} 

Khi tôi chạy mã tôi nhận được giao diện điều khiển đầu ra sau đây:

Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSIBPrototypingLayoutConstraint:0x7b74e280 'IB auto generated at build time for view with fixed frame' V:|-(1)-[UIScrollView:0x7b74c430] (Names: '|':UIView:0x7b74dd10)>", 
    "<<DeviceImagesTest.LayoutConstraint:0x7baa2760> <UIScrollView:0x7b6608d0>.top == <UIView:0x7b64d800>.top>" 
) 

Will attempt to recover by breaking constraint 
<NSIBPrototypingLayoutConstraint:0x7b74e280 'IB auto generated at build time for view with fixed frame' V:|-(1)-[UIScrollView:0x7b74c430] (Names: '|':UIView:0x7b74dd10)> 

Break on objc_exception_throw to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 
2015-05-29 18:37:14.368 DeviceImagesTest[36462:607] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSIBPrototypingLayoutConstraint:0x7b74e080 'IB auto generated at build time for view with fixed frame' H:|-(0)-[UIScrollView:0x7b74c430](LTR) (Names: '|':UIView:0x7b74dd10)>", 
    "<NSIBPrototypingLayoutConstraint:0x7b74e330 'IB auto generated at build time for view with fixed frame' H:[UIScrollView:0x7b74c430(600)]>", 
    "<<DeviceImagesTest.LayoutConstraint:0x7baa7170> <UIScrollView:0x7baa7b30>.right == <UIView:0x7baa79a0>.right>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa4800 h=-&- v=-&- UIView:0x7b74dd10.width == UIViewControllerWrapperView:0x7ba9f060.width>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa5180 h=-&- v=-&- UIViewControllerWrapperView:0x7ba9f060.width == UINavigationTransitionView:0x7bc769b0.width>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa58e0 h=-&- v=-&- UINavigationTransitionView:0x7bc769b0.width == UILayoutContainerView:0x7bc75140.width>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa61a0 h=-&- v=-&- UILayoutContainerView:0x7bc75140.width == UIWindow:0x7bc71870.width>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa69a0 h=--- v=--- H:[UIWindow:0x7bc71870(320)]>" 
) 

Will attempt to recover by breaking constraint 
<<DeviceImagesTest.LayoutConstraint:0x7baa95b0> <UIScrollView:0x7baa9610>.right == <UIView:0x7baa96b0>.right> 

Break on objc_exception_throw to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 
2015-05-29 18:37:14.496 DeviceImagesTest[36462:607] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSIBPrototypingLayoutConstraint:0x7b74e360 'IB auto generated at build time for view with fixed frame' V:[UIScrollView:0x7b74c430(600)]>", 
    "<<DeviceImagesTest.LayoutConstraint:0x7bc77e40> <UIScrollView:0x7bc7f6a0>.top == <UIView:0x7bc52180>.top>", 
    "<<DeviceImagesTest.LayoutConstraint:0x7bc49420> <UIScrollView:0x7bc74b00>.bottom == <UIView:0x7bc7b970>.bottom>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa4960 h=-&- v=-&- UIView:0x7b74dd10.height == UIViewControllerWrapperView:0x7ba9f060.height>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa51e0 h=-&- v=-&- UIViewControllerWrapperView:0x7ba9f060.height == UINavigationTransitionView:0x7bc769b0.height>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa5940 h=-&- v=-&- UINavigationTransitionView:0x7bc769b0.height == UILayoutContainerView:0x7bc75140.height>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa6200 h=-&- v=-&- UILayoutContainerView:0x7bc75140.height == UIWindow:0x7bc71870.height>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa69d0 h=--- v=--- V:[UIWindow:0x7bc71870(568)]>" 
) 

Will attempt to recover by breaking constraint 
<<DeviceImagesTest.LayoutConstraint:0x7bc84790> <UIScrollView:0x7bc848b0>.bottom == <UIView:0x7bc84860>.bottom> 

Break on objc_exception_throw to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 

Dường như Interface Builder được tạo ra ràng buộc đối với tôi ngay cả khi tôi đã làm không đặt bất kỳ. Điều này dẫn đến xung đột với các ràng buộc của tôi mà tôi đã đặt trong mã. Tôi cũng đặt setTranslatesAutoresizingMasks(false).

Tôi làm cách nào để ngăn Trình tạo giao diện khỏi các ràng buộc tạo tự động?

+0

Nếu bạn đang thiết * không hạn chế * trong kịch bản, sau đó trong mã, 'scrollview.setTranslatesAutoresizingMasksIntoConstraints (false)' – nhgrif

+0

Tôi sử dụng trình xây dựng giao diện không phải là Storyboard và tôi đã làm '' setTranslatesAutoresizingMasks (false) '' – confile

Trả lời

13

Nếu bạn nhầm lẫn về NSAutoresizingMaskLayoutConstraints trong danh sách đó, có thể là do bạn chưa gọi setTranslatesAutoresizingMasksIntoContraints(false) trên chế độ xem đó. (Mặc dù, tôi đã được ấn tượng rằng SnapKit làm điều đó cho bạn).

Nếu bạn nhầm lẫn về NSIBPrototypingLayoutConstraint, đó là ràng buộc được tạo tự động bởi Trình tạo giao diện. Để loại bỏ nó, thêm một số ràng buộc Top, Bottom, Leading và Trailing trong Interface Builder và thiết lập chúng để loại bỏ tại thời gian xây dựng. Để biết thêm chi tiết về điều đó, có một cái nhìn tại http://travisjeffery.com/b/2013/11/preventing-ib-auto-generated-at-build-time-for-view-with-fixed-frame/

UPDATE: url đã được đổi thành http://travisjeffery.com/b/2013/11/preventing-ib-auto-generated-at-build-time-for-view-with-fixed-frame-when-using-auto-layout/

0

Tôi làm cách nào để ngăn Trình tạo giao diện khỏi các ràng buộc tạo tự động?

Cách đơn giản nhất: chọn ngòi hoặc bảng phân cảnh trong trình điều hướng dự án, đi tới Thanh tra tệp và bỏ chọn "Sử dụng bố cục tự động".

+1

Nhưng tôi muốn sử dụng AutoLayout nhưng trong mã! – confile

+0

Đi thẳng về phía trước. Chúng tôi chỉ đơn giản là chuyển hành vi autolayout trong nib, đó là chính xác những gì bạn muốn làm. Bạn vẫn có thể sử dụng nó trong mã. Thử nó! – matt

+0

Không hoạt động theo cách đó. Bạn có thể kiểm tra ví dụ của tôi, tôi vẫn nhận được cảnh báo. – confile

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