美学原理适配 iOS 11 & iPhone X 大全

1.升级iOS11后造成的别

 1. 1升迁后,发现之一拥有tableView的界面错乱,组间距同contentInset错乱,因为iOS11备受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 格式的图形,iPhone7以上设备+iOS11免除有之live照片是”.heic”格式图片,同一张live格式的图纸,iOS10犯送就没有问题(转成为了jpg),iOS11便杀

      微信的处理方式是相同比同一转会成jpg格式

     QQ和钉钉的处理方式是直压缩,即使是原图也减少也非原图

     微信的逼格太强,没找到现成的办法,我使用的凡QQ 的方案

2、使用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之后,第一宗事当是当 iPhone
X(模拟器)上过把瘾,然后编译后哪怕意识报错了

   由于iPhone X的状态栏是同其它版本手机别比较大之,因此api
变化为于坏

   先后举行了以下适配

  适配点一:项目受到动用状态栏中图标判断时网络的切切实实状态

美学原理 6

差的代码

打印的 Log 报出以下错误: Trapped 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”

// 因此可见iPhone
X的状态栏是多嵌套了一致层,多收获一糟即可,最终适配代码为:

NSArray *children;

// 不能用 [[self deviceVersion] isEqualToString:@”iPhone X”]
来判断,因为iPhone X 的模拟器不见面回来 iPhone 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,因此这里为要是对准iPhone X 及其模拟器进行适配

3.3:iPhone X 只出 faceID,没有touchID,如果in的下来下到 touchID 解锁的地方,这里而因机型进行对应的适配

3.4:之前起偷懒的第一手采用20代状态栏高度,这些坑且使由此重复取状态栏高度

       CGRectGetHeight([UIApplication
sharedApplication].statusBarFrame)

3.5:然而iPhone X更甚之坑是屏幕的适配

第一看下屏幕尺寸

美学原理 10

顿时张图反映来不少音:

iPhone X的宽虽然同7凡一模一样的,但是高度差不多出145pt

采取三加倍图是至关重要,而且貌似认为肉眼所能所能认得别的最高的屏幕密度是300ppi,iPhone
X已达成458ppi(查证发现三星galaxy系列之屏幕密度是522ppi)

每当计划方,苹果官方文档发出明确要求,下面结合图例进行说明:

美学原理 11

显出来的筹划布局要求填写满整个屏幕

美学原理 12

填满的同时如果留意控件不要让死圆角和传感器部分所遮挡

美学原理 13

美学原理 14

 

有惊无险区域外的组成部分未允许生另和用户交互的控件

上面这张图外含信息有点多

头颅导航栏不予许进行用户交互的,意味着下面这点儿种植情景 Apple
官方是免同意的

美学原理 15

美学原理 16

脚虚拟区是顶替了民俗home键,高度为34pt,通过达成滑动而呼起多任务管理,考虑到手势冲突,这片为是免容许有任何可交互的控件,但是设计的背景图要埋至非安全区域

状态栏在匪安全区域,文档中为波及,除非可以透过隐藏状态栏给用户带来格外的价值,否则极将状态栏还叫用户

重复使用现有图片时,注意长宽比差异。iPhone X 与健康 iPhone
的屏幕长宽比不同,因此,全屏的 4.7 寸屏图像于 iPhone 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&iPhoneX的有些坑

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/