2013-09-04 26 views
84

Câu hỏi tôi có là đơ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 khi một khung nhìn bị xóa

Điều gì sẽ xảy ra với các ràng buộc bố cục khi chế độ xem bị xóa khỏi cấu trúc phân cấp chế độ xem (hoặc được chuyển sang chế độ xem khác)?

Ví dụ: hãy có vùng chứa C với các bản xem trước AB. Container C giữ một số hạn chế. Sau đó, chúng tôi gọi [A removeFromSuperview]. Điều gì xảy ra với các ràng buộc cho A?

Điều gì sẽ xảy ra nếu chúng tôi thêm A vào C nữa?

Trả lời

97

Các ràng buộc được xóa. Nếu bạn thêm lại A, bạn sẽ phải thực hiện 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 loại bỏ A, bạn có thể thêm chúng trở lại. Khi tôi làm một cái gì đó như thế này, tôi tiết kiệm được những hạn chế như thế này cho một cái nhìn gọi 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]; 
    } 
} 
+5

Có thể thực tế này được tìm thấ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 ở đâu cả. – Sulthan

+1

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 họ không phải là hệ thống bố trí sẽ có thể đánh giá chúng như thế nào trong tương lai? –

+5

Để rõ ràng như câu trả lời này có vẻ như nó sẽ được, nó vẫn còn rất hữu ích! –

2

Các khó khăn cũng được loại bỏ khi bạn [A removeFromSuperview]

Họ đang bị lãng quên và thêm từ A đến C một lần nữa cho biết thêm không hạn chế .

1

Chúng cũng bị xóa, bạn có thể thực hiện một thử nghiệm đơn giản. Chọn một khung nhìn SUBVIEW và tạo ra các ràng buộc để ràng buộc SUBVIEW theo dõi thay đổi kích thước của nó (như được gắn với các cạnh giám sát). Để làm điều đó, bạn thêm SUBVIEW dưới dạng chế độ xem con vào CONTAINERVIEW này và thêm vào như một ràng buộc như sau:
V: | - [SUBVIEW] - |
H: | - [SUBVIEW] - |
Những ràng buộc này nên được thêm vào giám sát SUBVIEW, do đó CONTAINERVIEW.
Nếu bạn loại bỏ 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 không xung quanh nữa.

31

Vì tôi cũng có câu hỏi này, tôi đã kiểm tra Tài liệu của Apple chỉ để xem các cú đá, và hóa ra là nó được ghi lại rằng các ràng buộc được loại bỏ.

Các documentation cho phương pháp UIView removeFromSuperview trạng thái:

gọi method này loại bỏ bất kỳ khó khăn mà tham khảo xem bạn được loại bỏ, hoặc tham chiếu đến bất kỳ điểm trong cây con của quan điểm bạn là loại bỏ.

Tôi không chắc chắn nếu điều này được ghi nhận vào năm ngoái khi câu hỏi ban đầu đã được đăng, nhưng tôi chỉ nghĩ rằng tôi muốn chia sẻ thông tin này trong trường hợp bất cứ ai cần nó ...

+0

Cảm ơn bạn đã thêm trực tiếp từ tài liệu – Esko918

3

Hãy nhận biết mặc dù, nếu bạn có hai khung nhìn cha mẹ độc lập A và B, và C con C, trong đó C hiện là phần con của A, với các ràng buộc thích hợp, 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 ném ngoại lệ, bởi 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 để xóa 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 chọn iOS

+0

Thú vị! 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 hỏi vì hiện tại tôi có một ngoại lệ lẻ tẻ, khi xóa bộ điều khiển chế độ xem, cho biết 'Không thể cài đặt ràng buộc trên chế độ xem' - điều tôi không làm. – JimmyB

0

Câu hỏi này cũng có thể được chứng minh bằng trình tạo giao diện. Khi kéo và thả UIView trên ViewController thê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.

+0

Câu trả lời không được giải thích, tôi nghĩ điều này sẽ hiệu quả. –

+0

Bảng phân cảnh chứng minh không có gì về hành vi thời gian chạy sẽ xảy ra như thế nào. Bảng phân cảnh có thể làm bất cứ điều gì nó muốn! – mxcl

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