iOS 11 适配集锦
iOS 11适配源码 Demo地址
安全区域的适配
用Xcode 9 创建storyboard或者xib时,最低版本支持iOS 8时会报: Safe Area Layout Guide before iOS 9.0 如图:
原因:在iOS7中引入的Top Layout Guide和Bottom Layout Guide,这些布局指南在iOS 11中被弃用,取而代之的是Safe Area Layout Guide.
当一个Viewcontroller 被嵌入到UINavigationcontroller 、Tab bar 或者ToolBar 中时, 我们可以使用 Top Layout Guide
和 Bottom Layout Guide
让 view根 据上下锚点自适应内容。如图:
在iOS 11中取而代之的是Safe Area Layout Guide,在iOS11中苹果用单独的Safe Area属性代替了上面的属性.安全区域限制于顶部和底部的锚点。如图:
解决办法:适配最低支持版本iOS 8,将图中的 Use Safe Area Layout Guide 取消即可
适配:设置TableView的高度为全屏,会自动适配。
- 有点Eclipse的味道了,遵守代理后,点击fix会自动填充完所需方法
自动实现所需方法效果(貌似实现了很多不常用的):
iOS11之后,大概因为largeTitle的原因,视图层级发生了变化,如果没有给titleView赋值,则titleView会直接添加在_UINavigationBarContentView上面,如果赋值了titleView,则会把titleView添加在_UITAMICAdaptorView上,而navigationBarButton被加在了_UIButtonBarStackView上,然后他们都被加在了_UINavigationBarContentView上
如果你的项目是自定义的navigationBar,那么在iOS11上运行就可能出现布局错乱的bug,解决办法是重写UINavigationBar的layoutSubviews方法,调整布局:
- (void)layoutSubviews {
[super layoutSubviews];
// 注意导航栏及状态栏高度适配
self.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), naviBarHeight);
for (UIView *view in self.subviews) {
if([NSStringFromClass([view class]) containsString:@"Background"]) {
view.frame = self.bounds;
}else if ([NSStringFromClass([view class]) containsString:@"ContentView"]) {
CGRect frame = view.frame;
frame.origin.y = statusBarHeight;
frame.size.height = self.bounds.size.height - frame.origin.y;
view.frame = frame;
}
}
}
titleView支持autolayout,这要求titleView必须是能够自撑开的或实现了- intrinsicContentSize方法:
- (CGSize)intrinsicContentSize {
return UILayoutFittingExpandedSize;
}
TabBarController
主要是tabBar高度及tabBarItem偏移适配,iPhoneX由于底部安全区的原因UITabBar高度由49pt变成了83pt,可以通过判断机型来修改相关界面代码:
// UIDevice 分类
- (BOOL)isIPhoneX{
if ([UIScreen instancesRespondToSelector:@selector(currentMode)]) {
return CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size);
}else{
return NO;
}
}
其他适配注意事项
部分项目的轮播图在iOS 11+Xcode编译的情况下,会出现是上下左右任意滚动的bug,推荐使用 YJBannerView轮播图,完全适配iOS 11。Github地址:YJBannerView 使用方法:链接