iOS 11 发布以来,因为一直在忙其他的事情(总之是跟代码无关的事情)这周终于空闲下来研究一下。
发现问题一
打开之前的一个项目,首页就发现一个问题,导航条隐藏整个页面上只有一个UITableView,然后出线了下面的一幕:
31512986907_.pic.jpg
页面并没有直接顶到顶端,而是空出了状态栏的空白。因为界面使用的是 storyboard 查了官方文档和各种资料发现可能是iOS11弃用了 automaticallyAdjustsScrollViewInsets 属性,取而代之的是 UIScrollView 新增了 contentInsetAdjustmentBehavior 属性,这一切的罪魁祸首都是新引入的 safeArea 。
然后就是想办法解决问题
首先想到的是在 storyboard 上把顶部的约束由 0 设置为 -20,过程中发现 ViewConroller 的 Top Layout Guide 的 Y 变为 20 了,由于粗心之前一直没有注意过 iOS 11 xcode 9 之前是多少。再把约束设置为 -20 之后页面显示没问题,但是在下拉刷新的时候发现一个小问题,就是下拉箭头显示在了页面上,并没有像之前一样显示在屏幕之外。到这时并没有继续去修改下拉控件,而是感觉这种解决方法并不是最合理的。
于是继续填坑。。。感觉还应该是 contentInset 上面的问题,然后查资料发现可以这样设置
if #available(iOS 11.0, *) {
UIScrollView.appearance().contentInsetAdjustmentBehavior = .never
}
写在 AppDelegate.swift 里面,运行模拟器,的确是解决了问题。但是运行期间有一次发现在没有隐藏导航条并且界面是 UIScrollView 或者 UITableView 的页面进入 3、4 级页面回退的时候当前页面会有一个向上的回弹动画,但是再次运行的时候发现有没有了这样的问题。所以建议可以把上面的代码放到隐藏导航条的页面上,把 UIScrollView.appearance() 设置为页面的 UIScrollView 或者其子类即可。
发现问题二
image.png 21512986888_.pic.jpg导航上的图片显示过大了。问题的原因大致是只要NavigationBar 使用了
initWithCustomView 这个方法,而 CustomView 的控件尺寸小于图像实际尺寸的话, iOS 11 系统会自动将该控件设置为图像的实际尺寸,所以 NavigationBar 上面的图像就会变形。找到原因就好处理了。
解决方法
第一种解决方法就是重新切图,将图片按照标准重新切图,但是对于有的程序员不会的话这个方法就比较坑了,还得找 UI 设计的同事重新切图。所以还是自己动手比较好。
所以第二种方法就是在原来的控件上添加一个父 View ,然后把 view 的背景设置为透明即可。具体原理暂时还不知道。
网友评论