2011-10-22 24 views
2

我只是指出,如果我把一個UIScrollView作爲一個UIViewController的根視圖:的UIScrollView和UINavigationController的相互作用

- (void)loadView 
{ 
    self.view = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
} 

我得到了很多的行爲自由:滾動視圖設置它的contentInsetscrollIndicatorInsets自動若狀態欄,導航欄或工具欄存在透亮,並更新屬性,如果任何導航佈局更改:

[self.navigationController setNavigationBarHidden:YES animated:YES]; 

不幸的是滾動視圖也改變了它的contentOffset AUTOMA當更改contentsInset時,如果導航欄消失,內容會在導航欄出現時消失。

我喜歡很多這種自由行爲,但是我希望我的內容在導航欄進出時保持不動,而且我無法找到要在哪裏避免contentOffset中的更改。

編輯:

一些堆棧跟蹤後,我發現了一個正被調用每一個偏移量自動調整時間的方法:[UIScrollView(Static) _adjustContentOffsetIfNecessary];但由於我找不到關於此方法的任何文檔,所以我不知所措。

回答

3

好的,我已經找到它了。 UIViewController有一個名爲'automaticallyAdjustsScrollViewInsets'的屬性,它在顯示/隱藏navigationBar時更改contentOffset。將其設置爲no以防止UIScrollView發生更改。

源(和iOS6的溶液):https://stackoverflow.com/a/20325593/936957

0

當您隱藏/顯示導航欄時,您是否嘗試設置內容插頁?

像這樣隱藏在:

[self.navigationController setNavigationBarHidden:YES animated:YES]; 
self.view.contentInset = UIEdgeInsetsMake(self.navigationController.navigationBar.bounds.size.height, 0, 0, 0); 

,這顯示了當:

[self.navigationController setNavigationBarHidden:NO animated:YES]; 
self.view.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); 

AFAIK contentInset不應由系統改變,它會改變你的應用程序的佈局...

+0

我都與滾動視圖作爲根的viewController視圖的子視圖手動工作的功能;在顯示和隱藏導航欄時,我會手動設置'contentsInset',並且我不會更改'contentOffset',因爲我希望我的內容保持原樣。我想知道的是,如果我可以使用scrollView作爲根視圖的自動功能,並且仍然使我的內容保持原狀。 – Yamanqui

+0

我不認爲這是可能的...我唯一能想到的其他事情是如果你想要文檔移動,就可以繼承UIScrollView並覆蓋'setContentOffset:'並只調用'[super setContentOffset:offset]'。順便說一下,所有以下劃線開頭的方法都是私有API,如果您對它們做任何事情,您的應用程序將不會被接受到App Store上。 – jjv360