如何iphone Facebook应用程序使导航栏固定

Muh*_*ker 0 iphone facebook uinavigationcontroller xcode4.2

我是iPhone开发的新手,想问一下导航控制器.如何使导航控制器固定在整个应用程序上,如facebook导航栏.它始终在导航栏中显示通知,朋友和消息.

我试图将自定义视图放在titleView中,但每次导航推送新视图时它都会消失?

Tho*_*eek 6

这里有一个类似的问题(/sf/ask/1174131871/),不幸的是它很快关闭了.我在这里兑现了它想要的荣耀.

如果您考虑使用基于选项卡的应用程序(带有隐藏选项卡)进行导航,则可以轻松实现持久性导航栏.

使用故事板:

在Storyboard中进行简单设置

  1. 创建一个新的UINavigationController(Nav 1).
  2. 将UITabController设置为Nav 1的根视图控制器.(Tab Bar)请注意,它将拥有自己的导航栏(我将其标记为"Persistent Nav Bar").
  3. 创建另一个UINavigationController(导航2).
  4. 将您选择的视图控制器(My View Controller)设置为Nav 2的根视图控制器.
  5. 将Nav 2设置为Tab Bar控制器的第一个(选项卡)视图控制器.

  6. 对于导航1:在属性检查器 - >导航控制器 - >栏可见性下,确保勾选该框(以便显示导航栏).

  7. 对于导航2:在属性检查器 - >导航控制器 - >栏可见性下,确保未勾选该框(以便它不会显示其导航栏).

如果您运行该应用程序,您应该看到标签栏的标题可见,并隐藏了视图控制器的标题.这为您提供了持久导航栏的基础知识.您可以从My View Controller将PUSHing视图保持在堆栈中,并且它将保持持久性.呈现MODAL视图将带来新的上下文,因此失去了持久性.如果重复这些步骤,您应该能够为模态显示的视图创建相同的效果.

本答案的其余部分涉及隐藏标签栏和管理导航栏元素.

这很好,但是如何将自定义视图放在导航栏中,以及如何隐藏该标签栏?

创建UITabBarController的子类,并将其分配给故事板中的Tab Bar控制器.

隐藏标签栏

您可以通过各种方式隐藏选项卡栏.如果您有兴趣,可以参考更多相关内容(如何隐藏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)];
    }
}
Run Code Online (Sandbox Code Playgroud)

这会将Tab Bar移出视图并调整视图大小以填充空间(没有动画,就像它从未出现过一样).将此代码段添加到开头,viewDidLoad以便将该栏移开.

导航栏中的自定义视图

viewDidLoad我们的TB子类的方法中,您可以使用按钮创建自定义视图,并将其添加到导航栏,如下所示:[self.navigationItem setTitleView:myCustomTitleView];Easy.

如果它没有正确显示,请确保在将其设置为titleView之前定义其框架.然后在添加它之后,使用[myCustomTitleView sizeToFit]它让它紧贴在导航栏中.

设置条形按钮项目

设置左右栏按钮项目需要对符号进行少量更改.通常,您可以通过引用设置左侧栏按钮self.navigationItem.leftBarButtonItem.该引用实际上指向HIDDEN导航栏的左侧栏按钮.要访问VISIBLE导航栏,请使用self.tabBarController.navigationItem.leftBarButtonItem.简单!

处理丢失的栏后退按钮项目

使用持久性导航栏牺牲的一件事是管理推送的视图.像后箭头这样的东西不会显示(它们出现在隐藏的导航栏上).您可以通过将TabBarController子类设置为其视图控制器(应该都是UINavigationControllers)的委托来克服这个问题.

for (UINavigationController *navController in self.viewControllers) {
    navController.delegate = self;
}
Run Code Online (Sandbox Code Playgroud)

只要这些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
}
Run Code Online (Sandbox Code Playgroud)

自定义后退按钮可以调用选项卡栏控制器子类中的方法,该方法告诉当前选定的视图控制器弹出其当前视图.

这是Facebook如何做到的?

我无法验证这是Facebook做到的方式(可能不是),但它会达到类似的效果.我在我的最新应用程序(http://www.waterboyapp.com)中有效地使用了它,苹果公司很高兴地接受了它.我希望之前有人在网上发布,因此我的贡献是为了节省数小时/天的搜索时间.

在旁边

此实现的额外好处(除了它的简洁和优雅)是您可以将多个视图控制器链接到选项卡栏.通过for循环和一点创造力,您可以在导航栏中重新创建自定义按钮(基于选项卡),这些按钮执行与标签栏相同的功能.这样可以节省屏幕空间(因为标签栏非常大),并且仍然使用标签栏来执行视图交换.