iOS 11导航栏设置BarButtonItem变形问题和错位问题
升级到 iOS 11,你可能会发现你的 App 的工具栏的行为出了点异常。比如奇点,我在使用过程中,发现工具栏时灵时不灵,感觉很难点到。这是怎么回事?通过 Xcode 的 Debug View Hierarchy 功能,我发现了问题所在:
注意看下图,ToolBar 里面的按钮的矩形可触模区域非常小,紧贴着图片。这就是为什么点击时灵时不灵的原因。

当我还在用 Xcode 8 + iOS 10 SDK 时,一切都是正常的。在 iOS 11 SDK 上,是出了什么问题?经过我的排除,发现是因为 UIBarButtonItem 的 CustomView 行为改变的原因。
是这样的,为了实现工具栏(UIToolbar)上按钮的一些特殊效果:比如点赞和收藏的时候,按钮会有放大的效果。奇点在这里使用了 UIButton 作为 UIBarButtonItem 的 CustomView,并且给 5 个 UIBarButtonItem 的 width 属性设置了一个均分的宽度。这样使不同按钮即使使用不同宽度的图片,也可以保持自身的宽度是一致的。
然而到了 iOS 11,UIBarButtonItem 的 width 这个属性在 CustomView 模式下失效了,那怎么办?必须得用 AutoLayout 了!
在 UIButton 创建的时候,同时加一句这样的代码:
button.widthAnchor.constraint(equalToConstant: buttonWidth).isActive = true
然后再设置给 UIBarButtonItem 的 customView 属性后,一切都会按之前 iOS 10 一样的行为进行工作了。
改完后,再看 Debug View Hierarchy 撑满了整个空白区域了,这时再点击工具栏就不会点到空白的地方了。

与此同理,可以通过 AutoLayout 给 CustomView 设置高度,使响应区域变得更大。这里我就不补充了。
总结:iOS 11 全面使用了 AutoLayout,所以很多在系统组件上用 CustomView 的形式进行定制的情况,都要仔细检查一下是否还正常工作。
iOS 11导航栏设置BarButtonItem变形问题和错位问题的更多相关文章
- iOS 11 导航栏 item 偏移问题 和 Swift 下 UIButton 设置 title、image 显示问题
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- iOS 解决导航栏左右 BarButtonItem偏移位置的问题
iOS7 之后,我们直接在导航栏添加barbuttonItem时候,会发现有一定偏移量, 比如: self.navigationItem.leftBarButtonItem = UIBarButton ...
- 转:ios导航栏设置
原帖:http://www.cocoachina.com/industry/20131104/7287.html 本文提供的代码需要用Xcode 5来执行.如果你还在使用老版本的Xcode,那么在运行 ...
- IOS 改变导航栏返回按钮的标题
IOS 改变导航栏返回按钮的标题 下午又找到了一个新的方法 这个方法不错 暂时没有发现异常的地方. 新写的App中需要使用UINavigationController对各个页面进行导航,但由于第一 ...
- ABP(现代ASP.NET样板开发框架)系列之22、ABP展现层——导航栏设置
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之22.ABP展现层——导航栏设置 ABP是“ASP.NET Boilerplate Project (ASP.NE ...
- 前端css小米导航栏设置及盒子定位居中问题
1.小米最上部导航栏设置 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- iOS开发——导航栏的一些小设置
1.导航栏的隐藏与显示:navigationBarHidden - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:YES]; ...
- iOS 自定义导航栏 和状态栏
一.更改状态栏颜色 (StatusBar) 就是比如导航栏是红色的状态栏是绿色的. 要实现这样的效果其实很简单,就是添加一个背景view. 简单的实现过程如下: 1 // 设置导航颜色 可用 2 [s ...
- 【转】【iOS】导航栏那些事儿
原文网址:http://www.jianshu.com/p/f797793d683f 参考文章 navigationItem UINavigationItem UINavigationBar UIBa ...
随机推荐
- volatile语义
volatile在Java内存模型(JMM)中,保证共享变量对所有线程可见,但不保证原子性.volatile语义是同步,通过共享变量的方式,完成线程间的通信. 为什么需要volatile Java内存 ...
- mysql索引最左匹配原则的理解
CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `ci ...
- Linux 对mysql远程授权连接操作 和 查看mysql数据库和表 基本命令
Linux 对mysql远程连接的授权操作 首先linux连接mysql数据库 授权: grant all on *.* to ' with grant option; //允许账户root从任何主机 ...
- 云服务利用Auto Scaling节省30%成本
公有云提供了很多免费的高级功能,很多中小用户以为自己用不上.实际上稍微研究一下,就能享受很多便利和节省不少成本. 本方案就是利用弹性伸缩(auto-scaling)减少服务器成本,几乎适合所有集群式部 ...
- javascipt——基础知识——基本数据类型和逻辑运算
进制转换:http://www.topthink.com/topic/504.html javascript的数据类型分为基本数据类型和非基本数据类型(对象) 一.基本数据类型: 包括以下部分:数字. ...
- ffmpeg一揽子
avformat_alloc_output_context2().在基于FFmpeg的视音频编码器程序中,该函数通常是第一个调用的函数(除了组件注册函数av_register_all()).avfor ...
- 【知识碎片】SQL篇
43.group by多个字段 查询每个班级男女生各多少人 Select count(id),xingbie,banji from tablename group by xingbie,banji 4 ...
- python中的变量以及字符串的使用
在python中只有一个变量:动态变量 在Python当中令人奇怪的是我们的python没有静态变量,这个特性大大的增加了python的灵活性. 由于python中没有静态变量所以我们千万不要使用静态 ...
- Vim 配置文件===/etc/vimrc
1.替换方法 替换对应的vimrc文件,定制自己的vimrc /etc/vimrc 替换此文件: /home/lmy/.vimrc 只对当前用户有效: Ubuntu9 ...
- 卸载phonegap
npm uninstall cordova -gnpm uninstall phonegap -g