2012-03-14 83 views
0

我是新的iPhone開發,並希望問關於導航控制器。我如何讓導航控制器在整個應用程序中修復,比如Facebook導航欄。它總是在導航欄中顯示通知,朋友和消息。如何iPhone的Facebook應用程序使導航欄固定

我試圖把自定義視圖放在titleView中,但每次導航推送新視圖時它都會消失?

回答

0

這對我來說

toolBar = [[UIView alloc]initWithFrame:CGRectMake(105, 20, 105, 44)]; 
notificationsBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
messagesBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 

[notificationsBtn setImage:[UIImage imageNamed:@"notifications-icon.png"] forState:UIControlStateNormal]; 
[notificationsBtn setFrame:CGRectMake(35, 0, 35 , 44)]; 
[notificationsBtn addTarget:self action:@selector(showNotifications:) forControlEvents:UIControlEventTouchUpInside]; 

[messagesBtn setImage:[UIImage imageNamed:@"messages-icon.png"] forState:UIControlStateNormal]; 
[messagesBtn setFrame:CGRectMake(70, 0, 35 , 44)]; 
[messagesBtn addTarget:self action:@selector(showMessages:) forControlEvents:UIControlEventTouchUpInside]; 

[toolBar addSubview:notificationsBtn]; 
[toolBar addSubview:messagesBtn]; 

[_window.rootViewController.view addSubview:toolBar];` 
0

應該理解的是,顯示的UINavigationBar是導航控制器層次結構頂部的視圖控制器的屬性。據瞭解,您可以嘗試自定義每個視圖控制器的UINavigationBar的titleView,例如在viewWillAppear。您可以訪問導航欄

self.navigationController.navigationBar 

其中self是加載的視圖控制器引用。

而對於你想要在屏幕上某個位置持久化視圖的情況,其中一個解決方案如下:在app-delegate類聲明一個屬性,將視圖直接添加到根視圖之後的窗口中,就像這樣:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

// something here ... 

// root view controller 
[window addSubview:myRootViewController.view]; 

// toolbar 
MyToolbar * tb = [MyToolbar new]; 
tb.barStyle = UIBarStyleDefault; 
[tb sizeToFit]; 
tb.frame = CGRectMake(0, 0, 320, 70); 
[window addSubview:tb]; 
self.globalToolBar = tb; 
[tb release]; 

那你就能夠更新任何視圖工具欄(在這種情況下,它可能是任何一般視圖)以這樣的方式

[[[[UIApplication sharedApplication] delegate] globalToolBar] updateRightButtonItem] 

所以你需要繼承UIToolBar與MyToolbar,在那裏添加一些UI方法,如updateRightButtonItem,您可能還需要創建委託或處理來自工具欄的捕獲頂部視圖控制器上的事件的通知。

這種方式視圖控制器的視圖將使用導航控制器邏輯進行動畫,但工具欄是一個窗口子視圖,不會被導航動作自動更改。

+0

是的,這是正確的,我知道它:)但現在我的問題是,如果是這種情況......如何使FACEBOOK導航欄固定 – 2012-03-14 15:49:04

+0

@Muhammad Shaker當然,看到更新,希望它有幫助。 – 2012-03-14 16:13:13

+0

感謝你@A-Live似乎是一個很好的解決方案,但是當我試圖添加任何視圖到窗口並且什麼也沒有運行時,其他的rootViewController ...有沒有像Z-Index這樣的東西? – 2012-03-15 10:08:35

5

有這裏(https://stackoverflow.com/questions/16773312/facebook-like-navigationbar)發佈了類似的問題的工作,遺憾的是它是相當迅速關閉。我在這裏兌現了自己的輝煌。

如果您想通過基於選項卡的應用程序(帶有隱藏標籤)進行導航,則可以輕鬆實現持久導航欄。

用故事板:

Simple setup in Storyboard

  1. 創建一個新的UINavigationController(NAV 1)。
  2. 將UITabController設置爲Nav 1的根視圖控制器。(Tab Bar)請注意,它將擁有自己的導航欄(我將其標記爲「Persistent Nav Bar」)。
  3. 創建另一個UINavigationController(Nav 2)。
  4. 將您的視圖控制器(My View Controller)設置爲Nav 2的根視圖控制器。
  5. 將Nav 2設置爲Tab Bar控制器的第一個(選項卡)視圖控制器。

  6. 對於導航1:在屬性檢查器 - >導航控制器 - >欄可見性,請確保該框是打勾(以便它顯示導航欄)。

  7. 對於導航2:在屬性檢查器 - >導航器 - > 酒吧的知名度,確保盒子取消勾選(這樣 不會顯示其導航欄)。

如果你運行的應用程序,你應該看到標籤欄的標題可見,並隱藏你的視圖控制器的標題。這爲您提供了持久導航欄的基礎知識。您可以從My View Controller保留PUSHing視圖到堆棧上,並保持持久性。呈現MODAL視圖將帶來新的上下文,因此持久性會丟失。如果您重複這些步驟,您應該能夠爲模態呈現視圖創建相同的效果。

該答案的其餘部分涉及隱藏標籤欄和管理導航欄元素。

所以這很好,但是如何將自定義視圖放置在導航欄中,以及如何隱藏該標籤欄?

創建UITabBarController的子類,並將其分配給故事板中的Tab Bar控制器。

隱藏標籤欄

可以隱藏在各種方式的標籤欄。如果您有興趣,請點擊這裏(How to hide uitabbarcontroller);這個小片斷是從我的回答改編中的線程:

CGRect screenRect = [[UIScreen mainScreen] bounds]; 
float fHeight = screenRect.size.height; 
if( UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) 
{ 
    fHeight = screenRect.size.width; 
} 

for(UIView *view in self.view.subviews){ 
    if([view isKindOfClass:[UITabBar class]]){ 
     [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)]; 
    }else{ 
     [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)]; 
    } 
} 

這將標籤欄移出的視圖,並調整視圖以填補空間(不包括動畫,就好像它從未有)。將此片段添加到viewDidLoad的開頭,以避開該欄。在導航欄中

在我們的TB子類的viewDidLoad方法

自定義視圖,您可以用按鈕創建自定義視圖,並把它添加到導航條像這樣:[self.navigationItem setTitleView:myCustomTitleView];容易。

如果它沒有正確顯示,請確保在將其設置爲titleView之前定義其框架。然後添加它後,使用[myCustomTitleView sizeToFit]讓它坐在導航欄中。

設置欄按鈕項目

設置左,右欄按鈕的項目要求在符號的微小變化。通常,您可以通過參考self.navigationItem.leftBarButtonItem來設置左側欄按鈕。該引用實際上指向HIDDEN導航欄的左側欄按鈕。要訪問VISIBLE導航欄,請使用self.tabBarController.navigationItem.leftBarButtonItem。簡單!

處理丟失酒吧後退按鈕的項目,你有持久的導航欄犧牲

一件事是推視圖的管理。像後退箭頭之類的東西不會顯示(它們出現在隱藏的導航欄上)。你可以通過設置你的TabBarController子類作爲它的視圖控制器的代理來解決這個問題(它們都應該是UINavigationControllers)。

for (UINavigationController *navController in self.viewControllers) { 
    navController.delegate = self; 
} 

每當這些UINavigationControllers的推動另一種觀點,你可以攔截與此委託方法這個動作:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;

在這裏,你可以檢查有多少視圖控制器推:

if(navigationController.viewControllers.count > 1){ 
    //create a custom back button here and add it to the nav bar 
}else{ 
    //set the left bar button (where the custom back button would sit) to nil 
} 

自定義後退按鈕可以調用標籤欄控制器子類中的方法,該方法告訴當前選定的vi ew控制器彈出其當前視圖。

這是Facebook如何做到的嗎?

我無法驗證這是Facebook做到的方式(可能不是),但它會達到類似的效果。我已經在我的最新應用(http://www.waterboyapp.com)中有效地使用了它,並且順利地被蘋果高興地接受。我希望有人之前在網上發佈此消息,因此我的貢獻是爲了節省數小時/天的搜索時間。

除了

增加的獎金,這個實現(除了它的簡潔和優雅)是可以在多個視圖控制器鏈接到標籤欄。通過for循環和一點創意,您可以在導航欄中重新創建自定義按鈕(基於選項卡),這些按鈕可以執行與選項卡相同的功能。這節省了屏幕空間(因爲選項卡欄非常大),並仍然使用選項卡欄來執行視圖交換。

+0

但是側視圖控制器呢?例如,我想爲此使用IIViewDeckController,不應該將deckController作爲根控制器嗎?整個解釋很棒。我設法通過子類化navigationController並將工具欄添加到導航控制器視圖中,並在推入新控制器時將其置於前端。 – Lukas 2013-09-20 07:34:08