簡體   English   中英

查看viewWillAppear:和viewDidAppear之間的框架更改:

[英]View frame changes between viewWillAppear: and viewDidAppear:

我在我的應用程序中發現了一個奇怪的行為,其中連接的IBOutlet在我的視圖控制器中調用viewWillAppear:viewDidAppear:之間的連接視圖框架。 這是我的UIViewController子類中的相關代碼:

-(void)viewWillAppear:(BOOL)animated {
    NSLog(@"%@", self.scrollView);
}

-(void)viewDidAppear:(BOOL)animated {
    NSLog(@"%@", self.scrollView);
}

和結果日志輸出:

MyApp[61880:c07] <UIScrollView: 0x1057eff0; frame = (0 0; 0 0); clipsToBounds = YES; autoresize = TM+BM; gestureRecognizers = <NSArray: 0x10580100>; layer = <CALayer: 0x1057f210>; contentOffset: {0, 0}>
MyApp[61880:c07] <UIScrollView: 0x1057eff0; frame = (0 44; 320 416); clipsToBounds = YES; autoresize = TM+BM; gestureRecognizers = <NSArray: 0x10580100>; layer = <CALayer: 0x1057f210>; contentOffset: {0, 0}>

這清楚地表明幀在兩次調用之間發生變化。 我想在viewDidLoad方法中使用視圖進行設置,但是如果內容在我屏幕上無法更改,那么這似乎沒用。 可能會發生什么?

文檔:

viewWillAppear:

通知視圖控制器其視圖即將添加到視圖層次結構中。

viewDidAppear:

通知視圖控制器其視圖已添加到視圖層次結構中。

因此,子視圖的幀尚未在viewWillAppear設置:

在視圖顯示到屏幕之前修改UI的適當方法是:

viewDidLayoutSubviews

通知視圖控制器其視圖剛剛布置了其子視圖。

Autolayout在我們設計和開發視圖GUI Autolayout做出了巨大的改變。 其中一個主要區別是autolayout不會立即改變我們的視圖大小,但只有在觸發時,這意味着在特定時間,但我們可以強制它立即重新計算我們的約束或將它們標記為“需要”布局。 它的作用類似於-setNeedDisplay
對我來說最大的挑戰是理解並接受這一點,我們不再需要使用自動調整遮罩,而框架在放置視圖時已成為無用的屬性。 我們不再需要考慮視圖位置,但我們應該考慮如何在彼此相關的空間中看到它們。
當我們想要混合舊的自動調整掩碼和自動布局時出現問題。 我們應該盡快考慮自動布局實現,並盡量避免在基於自動布局的視圖層次結構中混合使用舊方法。
可以使用僅使用自動調整掩碼的容器視圖,例如視圖控制器的主視圖,但如果我們不嘗試混合,則更好。
我從未使用過故事板,但最合適的是它是正確的。 使用Autolayout時,會在autolayout引擎開始計算時設置視圖的框架。 嘗試在視圖控制器的- (void)viewDidLayoutSubviews方法之后立即詢問相同的事情。
當autolayout引擎完成計算視圖的幀時,將調用此方法。

呼叫

self.scrollView.layoutIfNeeded()

viewWillAppear方法中。 之后,您可以訪問它的框架,它將與您在viewDidAppear打印的值相同

就我而言,將所有與幀相關的方法移動到

override func viewWillLayoutSubviews()

完美地工作(我試圖修改故事板中的約束)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM