iOS11 UINavigationBar 适配

今年6月份的WWDC大会已经过去,在此会上有众多的新特性。这里强调说一下UINavigationBar

UINavigationBar相关

先说下效果,在用到下面两个属性时,导航条不再是64的高度,导航标题也会变大,文字靠左对齐,当上下滑动页面时,导航条的高度会进行拉伸,文字也会缩放。

00.gif
  • prefersLargeTitles
  • largeTitleDisplayMode

用法:

self.navigationController.navigationBar.prefersLargeTitles = YES;
self.navigationItem.title = @"xxxx";
self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeAutomatic;

自定义UINavigationBar

相较于iOS11之前的版本,UINavigationBar结构上也与之前不同。如图:

图一 iOS11 later

图二 iOS11 before

不难看出,原来的UINavigationItemView被替换为_UINavigationBarContentView

如果直接初始化UINavigationBar并添加在当前ViewController上时就会出现图三所示的情况,即:子控件的高度只有44。为了解决此问题,可以先继承UINavigationBar,然后再遍历UINavigationBar的子控件并修改Frame:

图三
- (void)layoutSubviews {
    [super layoutSubviews];
#if TARGET_OS_IOS
    for (UIView *aView in self.subviews) {
        if ([@[@"_UINavigationBarBackground", @"_UIBarBackground"] containsObject:NSStringFromClass([aView class])]) {
            aView.frame = CGRectMake(0, -CGRectGetMinY(self.frame), CGRectGetWidth(self.frame), CGRectGetHeight(self.frame)+CGRectGetMinY(self.frame));
        }
    }
#endif
    
}

效果和iOS11之前一样,当然这不是最优方案,过于简单粗暴了点。


图四

开发环境

  • Xcode_9_beta_2

Demo

推荐阅读更多精彩内容

  • iOS 11 为整个生态系统的 UI 元素带来了一种更加大胆、动态的新风格。 本文介绍iOS11中在UI方面做了哪...
    张璠阅读 484评论 0 1
  • 一、NavigationBar UIBarItem UIBarItem在iOS11在中新增landscapeIma...
    灰s阅读 3,503评论 5 11
  • 1. They were by no means the only ones making their way t...
    Bebevino阅读 115评论 0 0
  • 胸口堵住了,好难受,这是怎么了?她出去了,叫我们帮忙看一下,两个人答应的,她刚出去一会儿,另一个人就走了,我要在那...
    周海双阅读 85评论 0 0
  • 近来坚持每天写千字文,感觉获益良多,每天都充满干劲,总想象不久的明年,自己或许也可以出书了。得意之下,多次寻思增加...
    一默如雷阅读 109评论 1 3