iOS11自定义导航条上移处理

在自定义导航条时,通常会继承系统的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,内部的子视图向上移动了导航栏高度的距离。

在自定义的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;
}
}
}
}
之后便正常了

有时设置BackgroundImage也可以
[_myNavBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
iOS11自定义导航条上移处理的更多相关文章
- jQuery Mobile 自定义导航条图标
1.jQuery Mobile 自定义导航条图标
- React Native中自定义导航条
这是2017年年初开始的公司的项目,对于导航条的要求很高,Android和iOS上必须用一致的UI,按钮位置还有各种颜色都有要求,而且要适应各种奇葩要求. 尝试了一下当时React Native自带的 ...
- iOS7新特性-完美解决iOS7关于自定义导航条UIBarButtonItem偏移的问题
前言: 本文由DevDiv社区@Vincent 原创,转载请注明出处! http://www.devdiv.com/iOS_iPhone-ios_ios_uibarbuttonitem_-thread ...
- 可自定义导航条功能案例ios项目源码
可定制的navigationitem ,当我们使用系统的方法设置navigationItem的leftItem或者rightItem时,我们会 发现item位置会有偏差(左边的偏右,右边的偏左).当设 ...
- React Native自定义导航条
Navigator和NavigatorIOS 在开发中,需要实现多个界面的切换,这时候就需要一个导航控制器来进行各种效果的切换.在React Native中RN为我们提供了两个组件:Navigator ...
- 自定义 导航条分割线,tabBar分割线颜色(或者是 去掉)
UIView * lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, bgView.frame.size.width, 0.5)]; l ...
- uni-app自定义导航栏按钮|uniapp仿微信顶部导航条
最近一直在学习uni-app开发,由于uniapp是基于vue.js技术开发的,只要你熟悉vue,基本上很快就能上手了. 在开发中发现uni-app原生导航栏也能实现一些顶部自定义按钮+搜索框,只需在 ...
- Nuxt/Vue自定义导航栏Topbar+标签栏Tabbar组件
基于Vue.js实现自定义Topbar+Tabbar组件|仿咸鱼底部凸起导航 最近一直在倒腾Nuxt项目,由于Nuxt.js是基于Vue.js的服务端渲染框架,只要是会vue,基本能很快上手了. 一般 ...
- 基于vue3+electron11实现QQ登录切换|自定义导航栏|托盘|打包
上一篇有给大家分享过使用vue3和electron快速搭建项目.创建多窗口/父子modal窗口的一些方法.今天继续给大家分享一些vue3.x+electron11项目开发中的一些知识点/踩坑记录,希望 ...
随机推荐
- sql server中的varchar和Nvarchar有什么区别?
很多开发者进行数据库设计的时候往往并没有太多的考虑char, varchar类型,有的是根本就没注意,因为存储价格变得越来越便宜了,忘记了最开始的一些基本设计理论和原则,这点让我想到了现在的年轻人,大 ...
- vue-cli脚手架build目录中的webpack.prod.conf.js配置文件
// 下面是引入nodejs的路径模块 var path = require('path') // 下面是utils工具配置文件,主要用来处理css类文件的loader var utils = req ...
- F7+vue 物理返回键监听使用
以前使用的是纯F7,这个项目加了Vue进去,但碰到了一个问题,就是这样监听不到安卓物理键的返回,它是点击返回,直接推出程序,这个坑有点深,查了不少资料也问了不少人,最后在网上看到了别人的写的,自己也改 ...
- nodejs和mongodb常见的小错误
1.直接使用nodejs会遇到以下问题: module.js:340 throw err; ^Error: Cannot find module 'mongodb' 解决方式如下 ...
- baidu-map
1 var map = new BMap.Map("wcp"); // 创建Map实例 2 map.centerAndZoom(new BMap.Point(9.123469591 ...
- 常用的lamp环境以及一些依赖包的安装
- Spring核心概念
Spring是一个轻量级的企业级框架,提供了loc容器,aop实现,DAO/OR支持,Web集成等功能,目标是使现有的JAVA EE技术更易用,并促进良好的编程习惯. 依赖注入让组件之间以配置文件的形 ...
- JS JQ 深拷贝之坑
之前做留言板的时候,我就被深拷贝坑了一次,这次做API管理系统,没想到又被深拷贝坑了一次. 最后,拷贝对象的时候,如果要用到对象里的prototype,一定要用$.extend(true,{},要拷贝 ...
- react-redux-store
store是联系state 和 reducer的部分 Store 有以下职责: 维持应用的 state: 提供 getState() 方法获取 state: 提供 dispatch(action) 方 ...
- Dubbo框架设计
各层说明 config配置层:对外配置接口,以 ServiceConfig, ReferenceConfig 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类 proxy服务 ...