2016-03-21 15 views
8

Tôi đã sử dụng các hạn chế tự động từ bảng phân cảnh. Tuy nhiên, trong một số trường hợp, tôi muốn tính toán chiều cao động của chế độ xem phụ. Tôi mã này trong viewDidAppear(), nó hoạt động tốt bởi vì phương thức này được gọi sau khi tất cả các khung nhìn được thiết lập bởi các ràng buộc bố trí. Vấn đề ở đây là tôi có thể thấy khung được thiết lập bởi các ràng buộc trong nửa giây. Và sau đó mã reframes xem.Khi các hạn chế tự động đặt khung trong suốt vòng đời của bộ điều khiển xem?

Tôi đã biết về viewDidLayout() được gọi sau khi các ràng buộc đã đặt khung để tôi có thể thay đổi. Nhưng nó không hoạt động. Nó giống như phương thức này được gọi trước khi sử dụng các ràng buộc.

Trả lời

6

Phương thức viewDidAppear được gọi ở cuối vòng đời xem. Vì vậy, nếu bạn thay đổi các ràng buộc ở đây, nó sẽ luôn luôn được hiển thị.

Nếu thay đổi bạn muốn thực hiện là sự kiện một lần, khi đó bạn có thể thực hiện theo phương thức viewWillAppear. Nhưng điều này sẽ không luôn luôn giúp đỡ vì bản vẽ xem có thể không phải lúc nào cũng được hoàn thành vào lúc này. Vì vậy, một lựa chọn tốt hơn là đặt mã trong viewWillLayoutSubviews hoặc viewDidLayoutSubviews.

LƯU Ý:viewWillLayoutSubviews hoặc viewDidLayoutSubviews sẽ được gọi nhiều lần trong vòng đời của một người xem, chẳng hạn như thay đổi hướng hoặc di chuyển trong và ngoài khác xem hoặc bất kỳ sự thay đổi khung cho rằng vấn đề.
Nếu thay đổi mã bạn muốn đặt ở đây là sự kiện một lần, hãy đảm bảo sử dụng cờ.

ví dụ như: -

- (void)viewWillLayoutSubviews {  
    if(firstTime) { 
     // put your constraint change code here. 
    } 
} 

Hope this helps! :)

+0

'viewWillAppear' không phải là" sự kiện một lần "nếu các chu trình bộ điều khiển xem được cho là giữa và không phải là bộ điều khiển xem nhiều nhất. Tôi tin rằng phương pháp bạn đang đề cập đến là 'viewDidLoad' –

+0

Đúng là phương thức này không phải là" sự kiện một lần ". Bạn có thể cần phải thêm kiểm tra xấu xí như trong 'viewWillLayoutSubviews'. 'viewDidLoad' không liên quan đến câu hỏi vì các lần xem phụ có thể không nhất thiết phải được tải bởi thời gian này. Hãy thử nó cho mình. – GoGreen

+0

Không, bạn đã đúng. Câu trả lời của tôi là nhiều sửa chữa cho bình luận của bạn về phương thức được gọi khi khung nhìn của trình điều khiển xem được nạp hơn câu hỏi ban đầu của OP. Lời xin lỗi của tôi. Bạn là đúng mặc dù, bằng cách sử dụng booleans cho các công cụ như thế này luôn luôn là kinh tởm, nhưng tôi sợ đó là một giải pháp nhanh chóng cho vấn đề OP có. –

0

Tôi không chắc chắn những gì bạn đang thực sự cố gắng thực hiện trong viewDidLayoutSubviews(). Tôi luôn sử dụng để tùy chỉnh chế độ xem bằng cách sửa đổi giá trị ràng buộc bố cục ghi đè phương pháp này.

// Called to notify the view controller that its view has just laid out its subviews 
    override func viewDidLayoutSubviews() { 
     //Write your code here, any constraint modification etc. 
     super.viewDidLayoutSubviews() 
    } 
+0

Tại sao trước cuộc gọi đến siêu? – Darko

3

Như tên cho thấy, viewDidLayoutSubviews được gọi khi quan điểm của viewController bạn vừa hoàn thành đẻ nó ra và bạn có thể giả định rằng ở đó chiều cao năng động quan điểm của bạn là ở những nơi chính xác của họ/khung theo chế autolayout của bạn.

Swift : 

    override func viewDidLayoutSubviews() { 
     // Set your constraint here 
    } 

Objective C : 

    -(void)viewDidLayoutSubviews { 
    // Set your constraint here 
    } 
+0

bạn có thể cho tôi biết cách viết mã để ghi đè phương thức này trong mục tiêu-c không? –

+0

@HirenPrajapati: Hãy cho tôi biết nếu điều này có ích. –

+0

Vâng đó chính là điều tôi đã làm. Nó hoạt động tốt. Nhưng không phải trong mọi trường hợp. Ví dụ: nếu có điều gì đó xảy ra như thay đổi kích thước nội dung cuộn, bố cục tự động sẽ đặt khung xem trên cài đặt ràng buộc mặc định. –

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