image.png

在自定义导航条时,通常会继承系统的UINavigationBar,但如上图,在iOS11上,导航条改动了。
自定义导航条代码

    -(MBNavigationBar *)myNavBar{
if (!_myNavBar) {
_myNavBar = [[MBNavigationBar alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 64)];
_myNavBar.barTintColor = [UIColor colorWithRed:245/255.0 green:245/255.0 blue:245/255.0 alpha:1.0];
_myNavBar.translucent = NO;
}
return _myNavBar;
}

高度设置为64,但看着高度只有44,而且上移到状态栏位置
不过仔细看层级结构对照可以发现,导航栏的高度还是64,内部的子视图向上移动了导航栏高度的距离。

 
image.png

在自定义的UINavigationBar中,遍历找到需要的控件,对size.height和origin.y和相应调整,
版本适配:iOS10之前使用的是_UINavigationBarBackground,iOS10之后改为_UIBarBackground

    #define IS_IPHONE_X ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)
- (void)layoutSubviews
{
[super layoutSubviews]; CGFloat systemVersion = [UIDevice currentDevice].systemVersion.floatValue;
for (UIView *view in self.subviews) {
if (systemVersion >= 11.0) {
if ([view isKindOfClass:NSClassFromString(@"_UIBarBackground")]) {
CGRect frame = view.frame;
frame.size.height = 64;
if (IS_IPHONE_X) {
frame.size.height = 88;
}
view.frame = frame;
}
if ([view isKindOfClass:NSClassFromString(@"_UINavigationBarContentView")]) {
CGRect frame = view.frame;
frame.origin.y = 20;
if (IS_IPHONE_X) {
frame.origin.y = 44;
}
view.frame = frame;
}
}
}
}

之后便正常了

 
image.png

有时设置BackgroundImage也可以

    [_myNavBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];

iOS11自定义导航条上移处理的更多相关文章

  1. jQuery Mobile 自定义导航条图标

    1.jQuery Mobile 自定义导航条图标

  2. React Native中自定义导航条

    这是2017年年初开始的公司的项目,对于导航条的要求很高,Android和iOS上必须用一致的UI,按钮位置还有各种颜色都有要求,而且要适应各种奇葩要求. 尝试了一下当时React Native自带的 ...

  3. iOS7新特性-完美解决iOS7关于自定义导航条UIBarButtonItem偏移的问题

    前言: 本文由DevDiv社区@Vincent 原创,转载请注明出处! http://www.devdiv.com/iOS_iPhone-ios_ios_uibarbuttonitem_-thread ...

  4. 可自定义导航条功能案例ios项目源码

    可定制的navigationitem ,当我们使用系统的方法设置navigationItem的leftItem或者rightItem时,我们会 发现item位置会有偏差(左边的偏右,右边的偏左).当设 ...

  5. React Native自定义导航条

    Navigator和NavigatorIOS 在开发中,需要实现多个界面的切换,这时候就需要一个导航控制器来进行各种效果的切换.在React Native中RN为我们提供了两个组件:Navigator ...

  6. 自定义 导航条分割线,tabBar分割线颜色(或者是 去掉)

    UIView * lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, bgView.frame.size.width, 0.5)]; l ...

  7. uni-app自定义导航栏按钮|uniapp仿微信顶部导航条

    最近一直在学习uni-app开发,由于uniapp是基于vue.js技术开发的,只要你熟悉vue,基本上很快就能上手了. 在开发中发现uni-app原生导航栏也能实现一些顶部自定义按钮+搜索框,只需在 ...

  8. Nuxt/Vue自定义导航栏Topbar+标签栏Tabbar组件

    基于Vue.js实现自定义Topbar+Tabbar组件|仿咸鱼底部凸起导航 最近一直在倒腾Nuxt项目,由于Nuxt.js是基于Vue.js的服务端渲染框架,只要是会vue,基本能很快上手了. 一般 ...

  9. 基于vue3+electron11实现QQ登录切换|自定义导航栏|托盘|打包

    上一篇有给大家分享过使用vue3和electron快速搭建项目.创建多窗口/父子modal窗口的一些方法.今天继续给大家分享一些vue3.x+electron11项目开发中的一些知识点/踩坑记录,希望 ...

随机推荐

  1. CRM创建BP(END USER)

    FUNCTION ZCRM_BP_CRT. *"---------------------------------------------------------------------- ...

  2. 合并两个 Lambda 表达式

    概述 在开发工作中,有些时候需要对一些增删改查进行封装(用 Lambda 表达式来筛选数据),但是又有一部分条件总是相同的,对于相同的部分可以直接写到方法里,而不同的部分作为参数传进去. 定义扩展方法 ...

  3. The innodb_system data file 'ibdata1' must be writable

    在安装MySQL的时候报的错,我理解的这个错是因为有个文件是Innodb需要在安装MySQL(或者创建数据库的时候)的时候需要写入这个文件,但是他现在没有写的权限. 日志中的错误是: 5.7版本以前是 ...

  4. python中pyperclip库的功能

    python3中pyperclip库的功能 作用就是复制.粘贴 例子 import pyperclip pyperclip.copy('Hello world!') pyperclip.paste() ...

  5. js零碎知识汇总

    1.window.location.href 表示在当前页面打开,不会打开新窗口. window.open 表示打开新窗口. 2.<input name="action" t ...

  6. SharePoint附加内容数据库时报错

    今天遇到一个很奇怪的问题,在sharepoint管理中心中给web application添加内容数据库时报错:The SharePoint database named WSS Content al ...

  7. 基于DES加密的服务端分析

    此程序建立了一个TCP服务端,端口号为10010,之后accept等待连接,如果接受到连接,那么就发送一些欢迎信息,以及提示信息---发送quit退出. 之后不停地调用recv,如果接受到数据,那么判 ...

  8. UVa LA 4636 Cubist Artwork 难度: 0

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  9. ES6 memo

    一.热门问题 介绍redux,主要解决什么问题 是管理应用程序状态的库,解决数据管理和数据通信的问题 Promise.Async有什么区别 Async 更简洁,不需要用 then 连接 Promise ...

  10. <input>标签单、复选相关查询地址

    http://www.w3school.com.cn/tags/tag_input.asp 以下是相关示例,转载 lfx_web: <html><head><script ...