2014-05-09 56 views
10

我有一個iOS應用程序,我需要知道什麼時候一個新視圖在屏幕上完全可見;也就是說,當Autolayout完成其計算並且視圖已完成繪製時。Autolayout完成時是否會觸發iOS方法?

ViewDidAppear在視圖完全可見之前似乎已經開啓。如果我關閉Autolayout,時間似乎與人類感知一致,但我需要在此項目中使用Autolayout(所以這不是一個解決方案......只是一個測試)。

當Autolayout完成計算時,是否有任何方法會觸發?或者當視圖實際可見時觸發的另一種方法(因爲ViewDidAppear不適用於此)?

謝謝!

+0

'viewDidLayoutSubviews'怎麼樣? –

回答

3

我爲此使用了viewDidLayoutSubviews。蘋果公司的文件稱:「打電話通知視圖控制器它的視圖剛剛佈置了它的子視圖。」

+2

'...但是,調用此方法並不表示視圖子視圖的各個佈局已被調整。' –

+0

某些子視圖layoutSubviews仍然保持調用,即使包含它的視圖控制器調用viewDidLayoutSubviews。子視圖不應該緊密耦合 – sheetal

13

下可以用來避免多個呼叫:

- (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

雖然它看起來像一個黑客,應該有更好的方式......它的工作原理,我很難找到任何其他的選擇!我需要它的原因是因爲我需要告訴一個特定的子視圖何時完成佈局,以便我可以使用它的尺寸,但據我所知,沒有辦法。 – aaroncatlin

+0

儘管這是一種解決方法,但我認爲它非常非常整齊。幹得好! –

+0

我只是擔心延遲。如果裝置會受到壓力,它可能會崩潰 –

0

什麼在我的情況下工作是要求佈局後改變約束值:

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

稍後重寫layoutSubviews方法:

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

您可以撥打setNeedsLayout也代替layoutIfNeeded

0

我猜實現viewDidLayoutSubviews是正確的做法,但我用了一個動畫只是寫同樣的方法內完成回調。

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 
}]; 
相關問題