2014-05-09 14 views
10

Tôi có một ứng dụng iOS mà tôi cần biết khi một chế độ xem mới hoàn toàn hiển thị trên màn hình; đó là, khi Autolayout đã hoàn thành các phép tính của nó và khung nhìn đã vẽ xong.Có phương pháp iOS nào kích hoạt khi Autolayout đã hoàn tất không?

ViewDidAppear dường như phát ra hiệu quả trước khi chế độ xem hiển thị hoàn toàn. Nếu tôi tắt Autolayout, thời gian dường như xếp hàng xa như nhận thức của con người, nhưng tôi cần phải sử dụng Autolayout trong dự án này (vì vậy đây không phải là một giải pháp ... chỉ là một thử nghiệm).

Có phương pháp nào kích hoạt khi tính toán Autolayout được thực hiện không? Hoặc một phương pháp khác mà cháy khi xem là thực sự có thể nhìn thấy (kể từ khi ViewDidAppear không làm việc cho điều này)?

Cảm ơn!

+0

Làm thế nào về 'viewDidLayoutSubviews'? –

Trả lời

3

Tôi đang sử dụng viewDidLayoutSubviews cho việc này. Tài liệu của Apple cho biết, "Được gọi để thông báo cho bộ điều khiển xem rằng chế độ xem của nó vừa trình bày các bản xem trước của nó."

+2

'... Tuy nhiên, phương pháp này được gọi không cho biết rằng bố cục riêng lẻ của các bản xem của chế độ xem đã được điều chỉnh.' –

+0

Một số bố cục chế độ xem phụSubviews vẫn tiếp tục gọi ngay cả khi trình điều khiển chế độ xem chứa cuộc gọi viewDidLayoutSubviews. Subviews không nên được kết hợp chặt chẽ – sheetal

13

Sau đây có thể được sử dụng để tránh nhiều cuộc gọi:

- (void) didFinishAutoLayout { 

    // Do some stuff here.  

    NSLog(@"didFinishAutoLayout"); 
} 

- (void) viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 


    [NSObject cancelPreviousPerformRequestsWithTarget:self 
           selector:@selector(didFinishAutoLayout) 
              object:nil]; 
    [self performSelector:@selector(didFinishAutoLayout) withObject:nil 
       afterDelay:0]; 
} 
+0

Mặc dù nó có vẻ như một hack và cần có một cách tốt hơn ... nó hoạt động và tôi đang ở một mất mát để tìm bất kỳ thay thế khác! Lý do tôi cần nó là bởi vì tôi cần phải nói khi nào một tiểu cảnh cụ thể đã hoàn thành việc đặt ra để tôi có thể sử dụng kích thước của nó, nhưng theo như tôi có thể nói, không có cách nào. – aaroncatlin

+0

Mặc dù nó là một cách giải quyết, tôi nghĩ rằng nó rất rất gọn gàng. Làm tốt lắm! –

+0

Tôi chỉ lo lắng về sự chậm trễ. Nó có thể bị hỏng nếu thiết bị bị căng thẳng –

0

gì nó làm việc trong trường hợp của tôi đã được yêu cầu bố trí sau khi thay đổi một giá trị hạn chế:

self.cnsTableviewHeight.constant = 50; 
    [self layoutIfNeeded]; 

Sau đó, bố cục ghi đèPhương pháp xem trước:

- (void) layoutSubviews { //This method when auto layout engine finishes 
    } 

Bạn có thể gọi setNeedsLayout cũng thay vì layoutIfNeeded

0

Tôi đoán thực hiện viewDidLayoutSubviews là cách chính xác nhưng tôi đã sử dụng một hình ảnh động chỉ để viết hoàn callback bên trong cùng một phương pháp.

someConstraint.constant = 100; // the change 

// Animate just to make sure the constraint change is fully applied 
[UIView animateWithDuration:0.1f animations:^{ 
    [self.view setNeedsLayout]; 
} completion:^(BOOL finished) { 
    // Here do whatever you need to do after constraint change 
}]; 
Các vấn đề liên quan