2013-07-05 15 views
16

Tôi có một bộ điều khiển xem và tôi muốn thèm muốn và đặt các ràng buộc xem của tôi trong updateViewConstraints. Tôi có điểm ngắt trong phương thức đó và nó không bao giờ được gọi.Khi nào (hoặc sẽ không) updateViewConstraints được gọi trên bộ điều khiển xem của tôi cho tôi theo khuôn khổ?

Tại sao nó không được gọi? Khi nào khuôn khổ muốn gọi phương thức này trên bộ điều khiển xem của tôi?

Trả lời

14

updateViewConstraints được gọi là viewWillLayoutSubviews (qua phương thức layoutSubviews của chế độ xem của bạn trên đường đi). Như tên cho thấy, điều này được gọi là bất cứ khi nào bộ điều khiển xem của bạn cần cập nhật bố cục của nó.

Nếu bạn thấy rằng updateViewConstraintskhông bao giờ gọi thì bạn nên đảm bảo rằng bạn đang gọi super phương thức của bộ điều khiển chế độ xem nếu cần.

Ngoài ra, có vẻ như bạn đang tạo các ràng buộc của bạn bên trong updateViewConstraints? Đó cũng có thể là nguyên nhân của vấn đề của bạn. Bạn nên cập nhật các ràng buộc của mình trong phương thức đó, chứ không phải tạo chúng (theo cùng cách mà trong layoutSubviews bạn định vị các chế độ xem của bạn, nhưng không khởi tạo chúng).

+1

Tôi vẫn không chắc tại sao updateViewConstraints không được gọi trên một số bộ điều khiển xem của tôi ... Tôi không chắc chắn khi nào nó sẽ được gọi hoặc khi không. – topwik

+0

Bạn có chắc chắn * thêm các ràng buộc chế độ xem của bạn bên ngoài 'updateViewConstraints' (tức là trong' viewDidLoad' hoặc tương tự) hay không. – lxt

+12

Tài liệu nói "Bạn có thể ghi đè phương thức này trong một lớp con để thêm ràng buộc vào khung nhìn hoặc các bản xem con của nó". Vì vậy, nó có vẻ hoàn toàn mát mẻ để tạo ra các ràng buộc trong updateConstraints: trong trường hợp khi bạn cần thay đổi giao diện của bạn một cách mạnh mẽ. – Andy

4

Chỉ cần đoán và không chắc chắn 100%:

updateViewConstraints sẽ không được gọi nếu chế độ xem gốc của bạn không yêu cầu bố cục tự động. Vì vậy, bạn phải thêm ít nhất một ràng buộc vào chế độ xem gốc của mình (một nơi nào đó trong chế độ xem tải xuống hoặc viewDidLoad) hoặc đặt

self.view.translatesAutoresizingMaskIntoConstraints = NO; 

Điều này sẽ kích hoạt điểm ngắt của bạn.

+0

Tôi nghĩ đây là câu trả lời đúng. Không cần phải gọi setNeedsUpdateConstraints. khi khung nhìn tải updateViewConstraints sẽ tự động được gọi. Hơn nữa chúng ta có thể tạo ra các ràng buộc trong updateViewConstraints, nó không chỉ giới hạn để cập nhật các ràng buộc. – posha

13

Bạn đang ở ViewController và bạn muốn hệ thống để gọi updateViewConstraints, sau đó bạn phải gọi đây là

[self.view setNeedsUpdateConstraints]; 
+1

Trong trường hợp của tôi, tôi đã thêm myView dưới dạng chế độ xem trực tiếp của self.view. Do self.view không được bố trí tự động được bật theo mặc định, [self.view setNeedsUpdateConstraints] không hoạt động nhưng [self.myView setNeedsUpdateConstraints] hoạt động - kích hoạt phương thức updateConstraints của myView. – Donald

10

bạn UIView phải thực hiện + (BOOL)requiresConstraintBasedLayout và trở YES. Trong trường hợp đó, updateViewConstraints ban đầu sẽ được gọi là ràng buộc thiết lập.

+1

Từ những gì tôi có thể nói điều này là gần đúng.Nếu UIView (hoặc một trong các phần con của nó) của UIViewController trả về TRUE cho + requiresConstraintBasedLayout thì trình điều khiển xem sẽ tham gia vào thiết lập bố trí tự động bằng cách gọi -updateViewConstraints. –

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