X及11更新

###iOS11 适配汇总

iOS11中直接取消了automaticallyAdjustsScrollViewInsets这个属性,有时候会导致scrollView自动向下偏移。适配方法:一个宏定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define adjustsScrollViewInsets_NO(scrollView,vc)\
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
if ([UIScrollView instancesRespondToSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:")]) {\
[scrollView performSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:") withObject:@(2)];\
} else {\
vc.automaticallyAdjustsScrollViewInsets = NO;\
}\
_Pragma("clang diagnostic pop") \
} while (0)
单个界面:
if (@available(iOS 11,*)) {
if ([tableview respondsToSelector:@selector(setContentInsetAdjustmentBehavior:)]) {
tableview.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
}

坑爹iOS11中tableView默认开启Self-Sizing,导致代理方法tableView:heightForHeaderInSection:tableView:heightForFooterInSection:无效。解决办法就是关闭Self-Sizing:

1
2
3
4
5
6
if (@available(iOS 11.0, *))
{
_tableView.estimatedRowHeight = 0;
_tableView.estimatedSectionHeaderHeight = 0;
_tableView.estimatedSectionFooterHeight = 0;
}

iOS11的NavigationItem上面的titleView狗血的会乱成屎。要么宽度不对要么莫名多出一块,解决办法:

1
2
3
4
- (CGSize)intrinsicContentSize
{
return UILayoutFittingExpandedSize;
}

图片放到bundle中的,导航栏用到的图片要写好@2x、@3x,或者直接用Images.xcassets管理


导航栏向上跑了部分距离

1
2
3
4
5
6
7
8
9
10
11
12
13
14
宏定义一个高度
#define NAVIGATION_HEIGHT (CGRectGetHeight([[UIApplication sharedApplication] statusBarFrame]) + CGRectGetHeight(self.navigationController.navigationBar.frame))
在你设置的self.navigationBar.frame = CGRectMake(0, 0,ScreenWidth, NAVIGATION_HEIGHT);下面添加
#ifdef __IPHONE_11_0
if (@available(iOS 11.0, *)) {
self.navigationBar.frame = CGRectMake(0, STATUSBAR_HEIGHT,ScreenWidth, NAVIGATION_HEIGHT);
}
#endif

VC中的tableView向下移动部分距离||加载webView的时候会向下移动部分距离

1
2
3
4
5
6
7
8
9
10
if (@available(iOS 11.0, *)) {
UIScrollView.appearance.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
// Fallback on earlier versions
}

self.navigationItem.titleView = titleView; 这样操作会导致放在导航栏上面的searchBar消失不见

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
更改后的代码是将titleView的UIView重写为TUIView
新建一个TUIView类,在该类的.m里面实现以下方法:
#import "TUIView.h"
@implementation TUIView
-(CGSize)intrinsicContentSize
{
return UILayoutFittingExpandedSize;
}
@end

iOS11 导航栏按钮位置问题的解决 http://blog.csdn.net/spicyShrimp/article/details/77891717

关于安全区域

http://www.jianshu.com/p/efbc8619d56b


适配iPhoneX不能铺满屏的问题

<1>给Brand Assets添加一张1125*2436大小的图片

打开Assets.xcassets文件夹,找到Brand Assets

右键Show in Finder

添加一张1125*2436大小的图片

<2>修改Contents.json文件,添加如下内容

1
2
3
4
5
6
7
8
9
{
"extent" : "full-screen",
"idiom" : "iphone",
"subtype" : "2436h",
"filename" : "1125_2436.png”,
"minimum-system-version" : "11.0",
"orientation" : "portrait",
"scale" : "3x"
}

搞事情的导航栏

高度变化

在iOS11导航栏多了一个LargeTitleView,专门显示大字标题用的,整个导航栏的高度达到了96p,这不包括状态栏的高度,也就是说,整个app顶部高度达到了116p,其中statusbar=20title=44largetitle=52不过默认是64p

当然,iPhoneX的高度会更高点,如果不显示大字标题,顶部的高度也达到了88,statusbar=44,title=44,如果显示大字标题,则高度变成了140,statusbar=44,title=44,largetitle=52,也就是说,iPhoneX的刘海高度为24p

(总结)
1
2
3
4
5
非iPhone X :
StatusBar 高20px,NavigationBar 高44px,底部TabBar高49px
iPhone X:
StatusBar 高44px,NavigationBar 高44px,底部TabBar高83px
1
2
3
4
#define kStatusBarHeight [[UIApplication sharedApplication] statusBarFrame].size.height
#define kNavBarHeight 44.0
#define kTabBarHeight ([[UIApplication sharedApplication] statusBarFrame].size.height>20?83:49)
#define kTopHeight (kStatusBarHeight + kNavBarHeight)
图层变化

iOS11之前导航栏的title是添加在UINavigationItemView上面,而navigationBarButton则直接添加在navigationBar上面;如果设置了titleView,则titleView也是直接添加在navigationBar上面

在iOS11之后,navigationBar会添加在_UIButtonBarStackView上面,而_UIButtonBarStackView则添加在_UINavigationBarContentView上面;如果没有给titleView赋值,则titleView会直接添加在_UINavigationBarContentView上面,如果赋值给了titleView,则会新生成_UITAMICAdaptorView,把titleView添加在这个类上面,这个类会添加在_UINavigationBarContentView上面

边距变化

在iOS11对导航栏里面的item的边距也做了调整,titleView调整最大的宽带,边距在iPhone6p上是20p,在iPhone6p以下是16p;在iOS11以下,这个边距分别是12p和8p;如果设置了左右navigationBarButton,则在iOS11里,navigationBarButton的边距是20p和16p;在iOS11以下,也是20p和16p;如果同时设置了titleView和navigationBarButton,则在iOS11以下,它们之间的间距是6p,在iOS11则无间距

左右按钮边距为0问题

在iOS11之前,可以设置一个width为负的navigationBarButton,将按钮挤到边缘,变相实现0边距的导航栏按钮,但是,这招在iOS11失效了,原因在于_UIButtonBarStackView,这个iOS9之后出来的,用来相对布局的组件,限制了子view的布局。


搞事情的tabbar的高度改变

iPhoneX的底部增加了虚拟Homeq区,由于安全区域的原因默认tabBar的高度由49变为83,增高了34,不过不管导航栏和tabbar一般系统都会自动适配safeArea。


位置权限

在IOS11,原有的NSLocationAlwaysUsageDeion被降级为NSLocationWhenInUseUsageDeion。因此,在原来项目中使用requestAlwaysAuthorization获取定位权限,而未在plist文件中配置NSLocationAlwaysAndWhenInUseUsageDeion,系统框不会弹出。建议新旧key值都在plist里配置,反正我试下来是没有问题,唯一的区别是使用requestAlwaysAuthorization获取权限 IOS11系统弹框会把几种权限级别全部列出,供用户选择,显然更人性化了。

快去更新你的info.plist

1
2
3
4
5
6
7
8
NSLocationUsageDescription
获取地理位置,精准推送服务
NSLocationWhenInUseUsageDescription
获取地理位置,精准推送服务
NSLocationAlwaysUsageDescription
App需要您的同意,才能始终访问位置
NSLocationAlwaysAndWhenInUseUsageDeion
App需要您的同意,才能始终访问位置

1
2
相册(写) NSPhotoLibraryAddUsageDescription
相册(读) NSPhotoLibraryUsageDescription

: 系统方法读取相册是不需要读取权限的 如果这个时候调用写相册权限必须plist加权限 如果给了读取权限 这个时候就不用调用写权限了


分割线


Xcode 9小Tips

1、导入图片若失败,手动在Build Phases —>Copy Binary With Libraies中重新添加一遍即可。

2、Xcode 9 打包时,记得在icon的添加1024*1024的图标。

3、鸡肋的无线调试功能(iPhone的电池…)可在Window –>Devices and Simulators中勾选那两个选项。前提是此设备已run过并处于同一局域网下。

4、在Asset中,可以创建颜色了。右键选择New image set,填充RGBA值或十六进制值即可。使用中直接使用新的colorwithname,参数填入创建时的名字即可。不过记得区分系统版本。

5、command键复原。可在Preferences –> Navigation –>Commadn-click 中选择Jumps to Defintion即可。

6、xcode 9 还允许多开模拟器