适配 iOS 11 & 酷派 X 大全

1.升官iOS11后造成的变动

 1. 1升高后,发现某些拥有tableView的界面错乱,组间距和contentInset错乱,因为iOS1第11中学UIViewController的automaticallyAdjustsScrollViewInsets属性被撇下了,由此当tableView超出安全区域时,系统自动会调整SafeAreaInsets值,进而影响adjustedContentInset值


// 某个界面以下使用代理方法来设置,发现并没有生效

– (CGFloat)tableView:(UITableView *)tableView
heightForHeaderInSection:(NSInteger)section;

– (CGFloat)tableView:(UITableView *)tableView
heightForFooterInSection:(NSInteger)section;

//
那样的法则是因为事先只是落成了莫斯中国科学技术大学学的代理方法,却不曾落成View的代办方法,iOS10及从前这么写是没难题的,iOS11开启了行高估量机制引起的bug,由此有以下二种缓解办法:

// 化解办法一:添加兑现View的代办方法,唯有完结下边多少个法子,方法
(CGFloat)tableView: heightForFooterInSection: 才会收效

– (UIView *)tableView:(UITableView *)tableView
viewForFooterInSection:(NSInteger)section {

return nil;

}

– (UIView *)tableView:(UITableView *)tableView
viewForHeaderInSection:(NSInteger)section {

return nil;

}

// 消除措施二:直接动用tableView属性进行设置,修复该UI错乱

self.tableView.sectionHeaderHeight = 0;

self.tableView.sectionFooterHeight = 5;

[_optionTableView setContentInset:UIEdgeInsetsMake(-35, 0, 0, 0)];

// 化解措施三:添加以下代码关闭推测行高

self.tableView.estimatedRowHeight = 0;

self.tableView.estimatedSectionHeaderHeight = 0;

self.tableView.estimatedSectionFooterHeight = 0;

1.2 假诺选拔了Masonry 实行布局,就要适配safeArea

           if ([UIDevice currentDevice].systemVersion.floatValue >=
11.0) {

         make.edges.equalTo(self.view.safeAreaInsets);

          } else {

          make.edges.equalTo(self.view);

        }

1.3 对于IM的出殡原图效能,iOS11开发银行全新的HEIC 格式的图片,诺基亚7以上设备+iOS11排出的live照片是”.heic”格式图片,同一张live格式的图形,iOS10发送就没难点(转成了jpg),iOS11就十分

      微信的处理形式是一比第一中学间转播成jpg格式

     QQ和钉钉的处理形式是一直压缩,就算是原图也裁减为非原图

     微信的逼格太高,没找到现成的法子,笔者使用的是QQ 的方案

② 、使用Xcode9 编译后意识的题材

   2.1
发现“fastSocket”第贰方报错,具体原因是缺乏C99的头文件,引入“#include ”即可

美学原理 1

 2.2 导航栏的新特点

    原生的搜索栏样式发生转移

美学原理 2

右手为iOS11样式,搜索区域中度变大,字体变大

翻看 API
后发现,iOS11后将searchController赋值给了NavigationItem,通过性能hidesSearchBarWhenScrolling能够决定搜索栏是或不是在滑行的时候进行隐蔽和出示

* *

// A view controller that will be shown inside of a navigation
controller can assign a UISearchController to this property to display
the search controller’s search bar in its containing navigation
controller’s navigation bar.

@property (nonatomic, retain, nullable) UISearchController
\
searchController API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);*

// If this property is true (the default), the searchController’s
search bar will hide as the user scrolls in the top view controller’s
scroll view. If false, the search bar will remain visible and pinned
underneath the navigation bar.

@property (nonatomic) BOOL hidesSearchBarWhenScrolling
API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);

其它,UINavigationBar新增属性
BOOL值prefersLargeTitles来兑现上边包车型大巴功能,并能够经过largeTitleTextAttributes来设置大标题的文本样式。设置大标题之后,导航栏的万丈就会由事先的64pt变成
96pt,假如项目中有一贯写死的莫斯中国科学技术大学学只怕隐藏导航栏之类的操作,就需求适配一下

美学原理 3

有个界面使用到了导航栏按钮相关的frame,也时有爆发了UI错乱,查看UI层级关系后意识,iOS11在此在此以前是直接把按钮加到了UINavigationBar下面,而iOS11则是先将按钮加到了_UITAMICAdaptorView,再加到_UIButtonBarStackView、_UINavigationBarContentView,接着才是UINavigationBar。因而一旦急需获得导航栏按钮
frame 或然 superView,那里须要特地做下适配

美学原理 4

美学原理 5

 

3.iPhone X的适配

   下载完Xcode9之后,第壹件事当然是在 HTCX(模拟器)上过把瘾,然后编写翻译后就意识报错了

   由于One plus X的状态栏是和别的版本手提式有线电话机差距相比大的,因而api
变化也正如大

   先后做了以下适配

  适配点一:项目中应用情形栏中图标判断当前网络的有血有肉情状

美学原理 6

出错的代码

打字与印刷的 Log 报出以下错误: 特拉普ed uncaught exception
‘NSUnknownKeyException’, reason: ‘[ valueForUndefinedKey:]: this
class is not key value coding-compliant for the key foregroundView.’

 

美学原理 7

iPhone X

 

美学原理 8

其余手提式有线电电话机

应用 runtime 打字与印刷其拥有属性,发现以下差别

// 测试代码

#import

NSMutableString *resultStr = [NSMutableString string];

//获取内定类的Ivar列表及Ivar个数

unsigned int count = 0;

Ivar *member = class_copyIvarList([[application
valueForKeyPath:@”_statusBar”] class], &count);

for(int i = 0; i < count; i++){

Ivar var = member[i];

//获取Ivar的名称

const char *memberAddress = ivar_getName(var);

//获取Ivar的类型

const char *memberType = ivar_getTypeEncoding(var);

NSString *str = [NSString stringWithFormat:@”key = %s           
type = %s

\n”,memberAddress,memberType];

[resultStr appendString:str];

美学原理,}

NSLog(@”%@”, resultStr);

 

// 别的版本的手提式无线电话机

key = _inProcessProvider            type = @””

key = _backgroundView              type =
@”UIStatusBarBackgroundView”

key = _doubleHeightLabel            type = @”UILabel”

key = _doubleHeightLabelContainer  type = @”UIView”

key = _currentDoubleHeightText      type = @”NSString”

key = _currentRawData              type = {超长。。}

key = _interruptedAnimationCompositeViews  type = @”NSMutableArray”

key = _newStyleBackgroundView      type =
@”UIStatusBarBackgroundView”

key = _newStyleForegroundView      type =
@”UIStatusBarForegroundView”

key = _slidingStatusBar            type = @”UIStatusBar”

key = _styleAttributes              type =
@”UIStatusBarStyleAttributes”

key = _waitingOnCallbackAfterChangingStyleOverridesLocally  type = B

key = _suppressGlow                type = B

key = _translucentBackgroundAlpha  type = d

key = _showOnlyCenterItems          type = B

key = _foregroundViewShouldIgnoreStatusBarDataDuringAnimation  type =
B

key = _tintColor                    type = @”UIColor”

key = _lastUsedBackgroundColor      type = @”UIColor”

key = _nextTintTransition          type =
@”UIStatusBarStyleAnimationParameters”

key = _overrideHeight              type = @”NSNumber”

key = _disableRasterizationReasons  type = @”NSMutableSet”

key = _timeHidden                  type = B

key = _statusBarWindow              type = @”UIStatusBarWindow”

// iPhone X

key = _statusBar ; type = @”_UIStatusBar”

// 因而可知小米X的状态栏是多嵌套了一层,多取一次即可,最终适配代码为:

NSArray *children;

// 不能用 [[self deviceVersion] isEqualToString:@”iPhone X”]
来判断,因为BlackBerry X 的模拟器不会回到 BlackBerry X

if ([[application valueForKeyPath:@”_statusBar”]
isKindOfClass:NSClassFromString(@”UIStatusBar_Modern”)]) {

children = [[[[application valueForKeyPath:@”_statusBar”]
valueForKeyPath:@”_statusBar”] valueForKeyPath:@”foregroundView”]
subviews];

} else {

children = [[[application valueForKeyPath:@”_statusBar”]
valueForKeyPath:@”foregroundView”] subviews];

}

3.2消除这几个标题后项目跑起来发现,整个app界面上下各空出大概40pt的可观

美学原理 9

会发觉尾部 UITabBar
是高出一些莫斯科大学,查看层级关系后意识,同样是由于安全区的来头,UITabBar
中度由49pt变成了83pt,因而那里也要对华为 X 及其模拟器实行适配

3.3:中兴 X 只有 faceID,没有touchID,假若in的选择有选用到 touchID 解锁的地点,那里要根据机型实行相应的适配

3.4:此前有偷懒的直白利用20代表状态栏中度,那么些坑都要经过重复获得状态栏中度

       CGRectGetHeight([UIApplication
sharedApplication].statusBarFrame)

3.5:可是HUAWEI X更大的坑是显示器的适配

率先看下显示屏尺寸

美学原理 10

那张图反映出累累音讯:

Samsung X的小幅度尽管和7是同等的,可是中度多出145pt

利用三倍图是最主要,而且一般认为肉眼所能所能识其他最高的显示器密度是300ppi,索爱X已完结458ppi(查证发现Samsunggalaxy种类的荧屏密度是522ppi)

在设计方面,苹果官方文书档案有鲜明须求,上边结合图例进行验证:

美学原理 11

来得出来的筹划布局供给填满整个荧屏

美学原理 12

填满的还要要留心控件不要被大圆角和传感器部分所遮挡

美学原理 13

美学原理 14

 

康宁区域以外的一部分分裂意有别的与用户交互的控件

地点那张图内含音讯略多

头顶导航栏不予许实行用户交互的,意味着上面那二种状态 Apple
官方是不允许的

美学原理 15

美学原理 16

底层虚拟区是代表了价值观home键,高度为34pt,通过上海滑稽剧团可呼起多职分管理,考虑到手势争持,这有的也是不允许有其余可相互的控件,可是设计的背景图要覆盖到非安全区域

情景栏在非安全区域,文档中也涉及,除非能够经过隐藏状态栏给用户带来额外的股票总市值,不然最棒把景况栏还给用户

重复使用现有图片时,注意长度宽度比差别。One plus X 与常规 三星的显示屏长度宽度比分化,因而,全屏的 4.7 寸屏图像在 Nokia X
上会出现裁切或适配宽度展现。所以,那有个别的视图须求依照设备做出适配。

美学原理 17

留神类似占位图的适配

3.6:设备音讯

if ([deviceString isEqualToString:@”iPhone10,1″])  return @”iPhone
8″;

if ([deviceString isEqualToString:@”iPhone10,4″])  return @”iPhone
8″;

if ([deviceString isEqualToString:@”iPhone10,2″])  return @”iPhone 8
Plus”;

if ([deviceString isEqualToString:@”iPhone10,5″])  return @”iPhone 8
Plus”;

if ([deviceString isEqualToString:@”iPhone10,3″])  return @”iPhone
X”;

if ([deviceString isEqualToString:@”iPhone10,6″])  return @”iPhone
X”;

 

详尽见参考链接吧, 别的不多说了.

适配iOS11&红米X的有的坑

http://www.cocoachina.com/ios/20170921/20623.html

http://www.jianshu.com/p/26fc39135c34

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

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

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

http://blog.csdn.net/keep_moving31038/article/details/77685591

http://blog.csdn.net/u013263917/article/details/72895728

https://mp.weixin.qq.com/s/mpjMa-ZfftuG5rR6OApC5A

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

https://github.com/XuYang8026/UniversalProject

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

https://www.cnblogs.com/Hakim/p/7566922.html

https://useyourloaf.com/blog/supporting-iphone-x/