2013-01-05 57 views
0
if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) { 
    NSLog(@"Device is in portrait"); 
} else if(UIInterfaceOrientationIsLandscape(self.interfaceOrientation)){ 
    NSLog(@"Device is in landscape"); 
} 
NSLog(@"View bounds are %@",NSStringFromCGRect(self.view.bounds)); 

我從viewDidLoad調用此代碼,然後從手勢識別器調用此代碼。當在橫向模式下,從viewDidLoad中的輸出爲:方向似乎與尺寸衝突

2013-01-04 20:44:48.925 293 Calendar[2638:907] Device is in landscape 
2013-01-04 20:44:48.926 293 Calendar[2638:907] View bounds are {{0, 0}, {748, 1024}} 

當從滑動手勢識別稱爲輸出是:

2013-01-04 20:44:58.002 293 Calendar[2638:907] Device is in landscape 
2013-01-04 20:44:58.004 293 Calendar[2638:907] View bounds are {{0, 0}, {1024, 748}} 

如果裝置處於橫向兩次,爲什麼相對尺寸?我應該在viewDidLoad之外查看其他視圖維度嗎?那會是什麼事?

我試過viewWillAppear,它和viewDidLoad一樣。 我試過viewDidAppear,它和手勢識別器一樣。所以我認爲這是我應該使用,而不是viewDidLoad正確的視圖尺寸。正確?

回答

1

在調整視圖控制器視圖的大小之前調用viewDidLoad方法。此時視圖尺寸顯示不正確是正常現象。

適當的地方處理所有這一切是viewWillLayoutSubviews。視圖的大小和方向由於初始顯示或由於方向更改而最新。這是你應該更新任何子視圖的地方,這些子視圖沒有通過某種自動佈局正確處理。

+0

謝謝。我認爲這就是我需要的。順便說一句,有沒有一個文件概述了這些方法的流程? –

+0

也許這不是我想要的。我需要觸發的代碼也需要從別處調用,例如,滑動手勢。問題是,當我從滑動手勢調用代碼時,會觸發viewWillLayoutSubview的調用,因此最終會被調用兩次。代碼中有些東西(可能是添加子視圖)會觸發viewWillLayoutSubviews。有什麼我可以設置直接觸發該方法? –

+0

我發現[一篇有趣的文章](http://kevin.dew.name/post/18579273258/where-to-progmatically-lay-out-views-in-ios-5-and)關於放置代碼的各個地方。在做出另一個決定之前,我會仔細研究它。 –

相關問題