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运行优化收藏
如何让你的SQL运行得更快(转贴) ---- 人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,而忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在大型的或是复杂的数据库环境 ...
- Maven中基于POM.xml的Profile来动态切换配置信息
[转载:https://blog.csdn.net/blueheart20/article/details/52838093] 1. Maven中的profile设置 Maven是目前主流的项目代码结 ...
- java protected修饰符说明
1. 简介 对protected修饰符进行阐述,结合Object类的clone方法进行说明.其中clone方法如下:protected Object Object.clone(): 关于protect ...
- C# deep copy List
https://stackoverflow.com/questions/14007405/how-create-a-new-deep-copy-clone-of-a-listt 1. copy lis ...
- 常用adb 指令
adb指令 monkey https://www.cnblogs.com/aland-1415/p/6949964.html
- Problem after converting keras model into Tensorflow pb - 将keras模型转换为Tensorflow pb后的问题
I'm using keras 2.1.* with tensorflow 1.13.* backend. I save my model during training with .h5 forma ...
- ES(Elasticsearch)
基本概念 Elasticsearch是一个实时分布式搜索和分析引擎 支持: 全文搜索 结构化搜索 分析 可以这样进行描述: 分布式的实时文件存储,每个字段都被索引并可被搜索 分布式的实时分析搜索引擎 ...
- express3/4引入socket.io
app.js var express = require('express'); var path = require('path'); var session = require('express- ...
- Java——值传递与引用传递
1.基本类型和引用类型在内存中的保存 (1)基本类型的变量保存原始值,即它代表的值就是数值本身: 基本类型在声明变量时就为它分配了空间: 基本类型在参数传递过程中属于值传递,也就是复制一份数据 ...
- centos7 下zookeeper 部署 单机多实例模式
centos7 下zookeeper 部署 本文参考https://www.linuxidc.com/Linux/2016-09/135052.htm 1.创建/usr/local/zookeeper ...