Điều gì xảy ra với các ràng buộc khi một chế độ xem bị xóa


109

Câu hỏi tôi có rất đơn giản nhưng tôi không thể tìm thấy bất kỳ thông tin nào trong tài liệu.

Điều gì xảy ra với các ràng buộc về bố cục khi một dạng xem bị xóa khỏi hệ thống phân cấp dạng xem (hoặc chuyển sang dạng xem khác)?

Ví dụ: hãy có vùng chứa Cvới các lượt xem phụ AB. Vùng chứa Ccó một số ràng buộc. Sau đó, chúng tôi gọi [A removeFromSuperview]. Điều gì xảy ra với các ràng buộc A?

Vậy thì sẽ xảy ra nếu chúng ta thêm Avào Cmột lần nữa?

Câu trả lời:


118

Các ràng buộc được loại bỏ. Nếu bạn thêm lại A, bạn sẽ phải tạo các ràng buộc mới cho nó hoặc nếu bạn lưu các ràng buộc trước khi xóa A, bạn có thể thêm lại chúng. Khi tôi làm điều gì đó như thế này, tôi lưu các ràng buộc như thế này cho một chế độ xem được gọi là view1:

self.portraitConstraints = [NSMutableArray new];
for (NSLayoutConstraint *con in self.view.constraints) {
    if (con.firstItem == self.view1 || con.secondItem == self.view1) {
       [self.portraitConstraints addObject:con];
    }
}

7
Có thể tìm thấy thực tế này ở đâu đó trong tài liệu không? Tôi tin bạn nhưng có vẻ lạ là thực tế không được đề cập ở bất cứ đâu.
Sulthan

2
Thông thường, các ràng buộc được loại bỏ cùng với chế độ xem thực sự. Nếu không phải là hệ thống bố trí thì làm thế nào hệ thống bố trí có thể đánh giá chúng trong tương lai?
Mike Pollard

6
Đối với câu trả lời hiển nhiên như nó sẽ là như vậy, nó vẫn rất hữu ích!
race_carr

1
@pnollet, tôi không biết tại sao người đăng trong câu hỏi đó đã làm những gì anh ta đã làm. Tôi đã ghi nhật ký này để xác minh và khi tôi xóa một chế độ xem phụ và kiểm tra các ràng buộc trên chế độ xem lại, những ràng buộc liên quan đến chế độ xem phụ đã bị loại bỏ sẽ biến mất.
rdelmar

4
@Firo, tôi chắc chắn rằng chúng phải bị xóa, vì vậy nếu chúng không có trong iOS 6, có lẽ đó là một lỗi. BTW, tài liệu cho phương thức removeFromSuperview cho biết, "Việc gọi phương thức này sẽ loại bỏ bất kỳ ràng buộc nào tham chiếu đến dạng xem bạn đang loại bỏ hoặc tham chiếu đến bất kỳ dạng xem nào trong cây con của dạng xem mà bạn đang loại bỏ".
rdelmar

41

Vì tôi cũng có câu hỏi này, nên tôi đã kiểm tra Apple Docs chỉ để tìm các cú hích, và hóa ra rằng các ràng buộc đã được gỡ bỏ.

Các tài liệu hướng dẫn cho các tiểu bang phương pháp UIView removeFromSuperview:

Gọi phương thức này sẽ loại bỏ bất kỳ ràng buộc nào tham chiếu đến dạng xem bạn đang loại bỏ hoặc tham chiếu đến bất kỳ dạng xem nào trong cây con của dạng xem bạn đang loại bỏ.

Tôi không chắc liệu điều này có được ghi lại vào năm ngoái khi câu hỏi ban đầu được đăng hay không, nhưng tôi chỉ nghĩ rằng tôi sẽ chia sẻ thông tin này trong trường hợp có ai cần nó ...


Nhờ tuyệt vời để thêm thẳng này từ doc
Esko918

3

Tuy nhiên, hãy lưu ý rằng nếu bạn có hai chế độ xem mẹ độc lập A và B và một chế độ xem phụ C, trong đó C hiện là chế độ xem con của A, với các ràng buộc thích hợp, việc gọi [B addSubview: C] sẽ KHÔNG xóa bất kỳ ràng buộc nào liên quan đến A và C, và bố cục tự động sẽ bắt đầu đưa ra các ngoại lệ, vì những ràng buộc đó không còn liên quan đến các khung nhìn trong cùng một hệ thống phân cấp.

Bạn sẽ cần gọi [C removeFromSuperview] một cách rõ ràng để loại bỏ các ràng buộc, trước khi thêm C vào B.

Điều này đúng trên Mac OS X - Tôi chưa kiểm tra iOS


Hấp dẫn! Nơi mà bạn đã có được thông tin này? Các tài liệu cho addSubview không đề cập đến hành vi này. Tôi đang hỏi vì tôi hiện có một ngoại lệ lẻ tẻ, khi xóa bộ điều khiển chế độ xem, điều đó nói rằng 'Không thể cài đặt hạn chế đối với chế độ xem' - điều mà tôi không làm.
JimmyB

2

Các ràng buộc cũng được loại bỏ khi bạn [A removeFromSuperview]

Chúng bị lãng quên và việc thêm A vào C một lần nữa không có bất kỳ ràng buộc nào.


0

Chúng cũng bị loại bỏ, bạn có thể làm một bài kiểm tra đơn giản. Chọn một SUBVIEW dạng xem và tạo các chi phí ràng buộc SUBVIEW tuân theo việc thay đổi kích thước superview của nó (như được gắn vào các cạnh superview). Để làm điều đó, bạn thêm SUBVIEW làm chế độ xem phụ vào CONTAINERVIEW này và thêm dưới dạng các ràng buộc tương tự:
V: | - [SUBVIEW] - |
H: | - [SUBVIEW] - |
Những ràng buộc này nên được thêm vào SUBVIEW superview, do đó CONTAINERVIEW.
Nếu bạn xóa SUBVIEW bằng cách chỉ cần kiểm tra tất cả các ràng buộc CONTAINERVIEW, bạn có thể thấy rằng hai ràng buộc không còn tồn tại nữa.


0

Câu hỏi này cũng có thể được chứng minh bởi trình xây dựng giao diện. Khi kéo và thả a UIViewtrên ViewControllerthêm các ràng buộc rồi xóa UIView, bạn có thể thấy các ràng buộc màu xanh biến mất.


4
Bảng phân cảnh không chứng minh gì về cách hành vi thời gian chạy sẽ xảy ra. Storyboard có thể làm bất cứ điều gì nó muốn!
mxcl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.