2015-11-06 25 views
2

我在iOS 7和8上工作的應用程序在iOS9上有一些小問題,其中一個是單個視圖控制器得到錯誤的高度。UIViewController在初始加載時錯誤的高度

以下代碼:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self layoutViews]; 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    [self layoutViews]; 
} 

- (void)layoutViews { 
    NSLog(@"Size-> %@", NSStringFromCGRect(self.view.frame)); 
} 

產生如下誤輸出:

2015-11-06 22:42:31.737 app[62442:1136052] Size-> {{0, 0}, {375, 667}} 
2015-11-06 22:42:33.318 app[62442:1136052] Size-> {{0, 32}, {667, 343}} 
2015-11-06 22:42:34.885 app[62442:1136052] Size-> {{0, 64}, {375, 603}} 
2015-11-06 22:45:18.063 app[62442:1136052] Size-> {{0, 32}, {667, 343}} 

當I:

  1. 打開VC在肖像
  2. 旋轉到橫向
  3. 轉回肖像
  4. 轉回景觀

看來,VC的初始負載提供self.frame.size下錯了尺寸,而所有後續的旋轉是正確的。 603的高度是正確的,但您可以看到在兩次旋轉後,它在667處仍然不正確。

我認爲與導航控制器欄有關可能會打破它。我在viewDidLoad方法的代碼很簡單:

- (void)viewDidLoad { 
    if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) { 
     [self setEdgesForExtendedLayout:UIRectEdgeNone]; 
    } 

    [super viewDidLoad]; 
} 

其中iOS上的正常工作8

更新 通過將呼叫固定這viewDidAppear

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self layoutViews]; 
    [activitiesTable flashScrollIndicators]; 
} 
+0

你已經啓用了狀態欄? –

+0

是的,我總是有狀態欄。 –

回答

0

你的代碼是正確的,它的工作完美后第一次加載。

因此問題與第一個加載應用程序。

用於自動佈局的Apple文檔提供了答案。

您只需要在viewDidAppear:方法中編寫代碼即可。

所以從viewDidLoad:方法編寫代碼來

-(void)viewDidAppear:(BOOL)animated{ 
[super viewDidAppear:animated]; } 
+0

我甚至試過這個。我在調用setEdgesForExtendedLayout時確實出現了,它給了我相同的結果! –

+0

這工作,我忽略了'viewDidAppear'方法。在iOS9中,有必要額外激發'viewDidAppear'中的'layoutViews'自定義方法。這顯示了iOS9中行爲的明顯差異,但是嘿..我們習慣了這一點;) –

0

我不是確定爲什麼你加入setEdgesForExtendedLayoutviewDidLoad。我試了你的方式

UIRectEdgeNone

2015-11-06 19:40:41.881 Test[934:275179] Size-> {{0, 64}, {375, 603}} 

我有我的看法控制器上的導航欄。

UIRectEdgeTop & & UIRectEdgeAll

2015-11-06 19:52:18.086 Test[1113:331687] Size-> {{0, 0}, {375, 667}} 

UIRectEdgeLeft & & UIRectEdgeBottom & & UIrectEdgeRight & & UIRectEdgeNone

2015-11-06 19:54:43.864 Test[1137:343893] Size-> {{0, 64}, {375, 603}} 

如文檔中所述:

在iOS 7中,視圖控制器使用全屏佈局。同時,iOS 7可以讓您更細緻地控制視圖控制器佈置其視圖的方式。特別是,全屏佈局的概念已經完善,可以讓視圖控制器指定其視圖的每個邊緣的佈局。

的wantsFullScreenLayout視圖控制器屬性在 棄用的iOS 7.如果當前指定wantsFullScreenLayout = NO,視圖 控制器可以在不希望的屏幕位置 當它在IOS 7.

運行顯示其內容使用edgesForExtendedLayout來指定視圖的哪些邊應該被擴展,而不管酒吧的半透明度如何。默認情況下,此屬性的值爲UIRectEdgeAll。

如果你看看視圖調試器下的情況下UIRectEdgeAll VS UIRectEdgeNone

如果使用UIRectEdgeAll,視圖控制器視圖使用全屏幕布局: enter image description here

如果使用UIRectEdgeNone中,視圖控制器將不會使用全屏佈局,它會將視圖向右推到導航欄的底部:

enter image description here

我建議使用UIEdgeRectAll而不是UIEdgeRectNone,除非你真的想組織所有子視圖的框架,包括您的視圖控制器視圖!!!!

+0

使用UIEdgeRectNone沒有任何問題。默認值是UIRectEdgeAll,因爲默認行爲是一個半透明導航欄,其內容顯示在下方。使用不透明導航欄時,顯示正下方的內容是有意義的。 – Mercurial

+0

我使用UIRectEdgeNone來解決視圖在導航欄下移動帶來的煩惱 - 迄今爲止,這是我以編程方式找到的最簡單的方法。令人困惑的是爲什麼我的例子*旋轉後改變高度。只要它是一致的,我不介意它的表現如何。 以您的UIRectEdgeLeft + UIRectEdgeRight + UIRectEdgeBottom + UIRectEdgeNone爲例,我得到667個高,667個長(旋轉),603個高(旋轉),這與我之前獲得的相同。無論我在那裏設置的高度是不一致的.. –

+0

我的意思是當單獨使用,而不是通過添加它們! –

相關問題