添加兑现View的代理方法,添加兑现View的代办方法

1.晋级iOS11后导致的生成

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. 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.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 的方案

1.3 对于IM的出殡原图功用,iOS11运维全新的HEIC 格式的图样,Motorola7以上设备+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

二 、使用Xcode9 编译后意识的难点

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

澳门金冠网站主页 6

 2.2 导航栏的新天性

    原生的搜索栏样式发生改变

澳门金冠网站主页 7

出手为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,假使项目中有一直写死的惊人可能隐藏导航栏之类的操作,就须要适配一下

澳门金冠网站主页 8

有个界面使用到了导航栏按钮相关的frame,也时有爆发了UI错乱,查看UI层级关系后发现,iOS11原先是直接把按钮加到了UINavigationBar上边,而iOS11则是先将按钮加到了_UITAMICAdaptorView,再加到_UIButtonBarStackView、_UINavigationBarContentView,接着才是UINavigationBar。由此一旦须求获得导航栏按钮
frame 恐怕 superView,那里要求专门做下适配

澳门金冠网站主页 9

澳门金冠网站主页 10

 

 

3.iPhone X的适配

   下载完Xcode9之后,第叁件事自然是在 红米X(模拟器)上过把瘾,然后编写翻译后就发现报错了

   由于HTC X的状态栏是和任何版本手提式无线电话机差别相比大的,由此api
变化也正如大

   先后做了以下适配

  适配点一:项目中选取情形栏中图标判断当前网络的现实况形

澳门金冠网站主页 11

阴差阳错的代码

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

 

澳门金冠网站主页 12

iPhone X

 

澳门金冠网站主页 13

其余手提式有线话机

使用 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”]
来判断,因为HTC X 的模拟器不会回来 索爱 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.iPhone X的适配

   下载完Xcode9之后,第2件事自然是在 SamsungX(模拟器)上过把瘾,然后编写翻译后就发现报错了

   由于金立 X的状态栏是和其他版本手提式无线电话机差距比较大的,因而api
变化也正如大

   先后做了以下适配

  适配点一:项目中运用情况栏中图标判断当前网络的切实情状

澳门金冠网站主页 14

阴差阳错的代码

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

 

澳门金冠网站主页 15

iPhone X

 

澳门金冠网站主页 16

别的手提式无线电话机

行使 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 的模拟器不会回到 酷派 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的惊人

澳门金冠网站主页 17

会发觉尾部 UITabBar
是高出一些莫斯中国科学技术大学学,查看层级关系后发现,同样是由于安全区的缘故,UITabBar
中度由49pt变成了83pt,由此那里也要对HUAWEI X 及其模拟器实行适配

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

澳门金冠网站主页 18

会发觉底部 UITabBar
是高出一些可观,查看层级关系后意识,同样是由于安全区的原故,UITabBar
中度由49pt变成了83pt,由此那里也要对Nokia X 及其模拟器举办适配

3.3:一加 X 唯有 faceID,没有touchID,就算in的应用有利用到 touchID 解锁的地方,那里要依据机型进行对应的适配

3.3:BlackBerry X 唯有 faceID,没有touchID,若是in的使用有使用到 touchID 解锁的地点,那里要依照机型实行对应的适配

3.4:从前有偷懒的间接使用20代表状态栏高度,这么些坑都要经过重复获得状态栏低度

       CGRectGetHeight([UIApplication
sharedApplication].statusBarFrame)

3.4:在此之前有偷懒的平昔动用20代表状态栏中度,那几个坑都要透过重复赢得状态栏中度

       CGRectGetHeight([UIApplication
sharedApplication].statusBarFrame)

3.5:可是索爱 X更大的坑是荧屏的适配

首先看下荧屏尺寸

澳门金冠网站主页 19

那张图反映出过多音讯:

金立 X的肥瘦即便和7是一致的,但是中度多出145pt

行使三倍图是重中之重,而且貌似认为肉眼所能所能识其余最高的荧屏密度是300ppi,NokiaX已达到458ppi(查证发现三星(Samsung)galaxy系列的显示器密度是522ppi)

在设计方面,苹果官方文档有显著供给,上面结合图例进行验证:

澳门金冠网站主页 20

来得出来的陈设布局须求填满整个显示器

澳门金冠网站主页 21

填满的同时要专注控件不要被大圆角和传感器部分所遮挡

澳门金冠网站主页 22

澳门金冠网站主页 23

 

有惊无险区域以外的有的不允许有任何与用户交互的控件

地点那张图内含新闻略多

头顶导航栏不予许举办用户交互的,意味着下边那三种意况 Apple
官方是不一样意的

澳门金冠网站主页 24

澳门金冠网站主页 25

底层虚拟区是代表了观念home键,中度为34pt,通过上海滑稽剧团可呼起多任务管理,考虑到手势争论,那部分也是不相同意有其余可相互的控件,可是设计的背景图要遮盖到非安全区域

场馆栏在非安全区域,文书档案中也涉及,除非能够通过隐藏状态栏给用户带来额外的市场总值,不然最佳把意况栏还给用户

重复使用现有图片时,注意长度宽度比差别。OPPO X 与平常 Motorola的显示器长宽比差别,由此,全屏的 4.7 寸屏图像在 索尼爱立信 X
上会出现裁切或适配宽度显示。所以,那有的的视图供给依据设备做出适配。

澳门金冠网站主页 26

专注类似占位图的适配

3.5:可是Samsung X更大的坑是显示屏的适配

先是看下显示屏尺寸

澳门金冠网站主页 27

这张图反映出不可胜举音讯:

索爱 X的增长幅度就算和7是同等的,不过中度多出145pt

应用三倍图是珍视,而且貌似认为肉眼所能所能识别的最高的荧屏密度是300ppi,金立X已落得458ppi(查证发现Samsunggalaxy系列的显示屏密度是522ppi)

在安插方面,苹果官方文书档案有明显供给,上面结合图例举办验证:

澳门金冠网站主页 28

展现出来的统一筹划布局供给填满全数显示器

澳门金冠网站主页 29

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

澳门金冠网站主页 30

澳门金冠网站主页 31

 

安然区域以外的一部分区别意有别的与用户交互的控件

上边那张图内含音讯略多

底部导航栏不予许举行用户交互的,意味着下边这三种情况 Apple
官方是不允许的

澳门金冠网站主页 32

澳门金冠网站主页 33

底层虚拟区是代表了守旧home键,中度为34pt,通过上滑可呼起多职务管理,考虑到手势争执,那有的也是不允许有别的可互相的控件,可是设计的背景图要遮盖到非安全区域

意况栏在非安全区域,文书档案中也波及,除非可以通过隐藏状态栏给用户带来额外的市场总值,不然最棒把情况栏还给用户

重复使用现有图片时,注意长度宽度比差别。摩托罗拉 X 与经常 HUAWEI的显示器长度宽度比不一样,因而,全屏的 4.7 寸屏图像在 Motorola X
上会出现裁切或适配宽度展现。所以,那有个其余视图要求依照设备做出适配。

澳门金冠网站主页 34

小心类似占位图的适配

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”;

 

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

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/

适配iOS11&HTCX的片段坑

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/

相关文章