适配 iOS 11 & iPhone X 大全

2019-10-15 07:40 来源:未知

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

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之后,第一件事自然是在 摩托罗拉X(模拟器)上过把瘾,然后编写翻译后就开掘报错了

   由于OPPO X的状态栏是和任何版本手机差别相当大的,由此api 变化也正如大

   前后相继做了以下适配

  适配点一:项目中运用境况栏中Logo决断当前网络的有血有肉景况

图片 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"

// 因此可以知道黑莓X的状态栏是多嵌套了一层,多取叁遍就能够,最后适配代码为:

NSArray *children;

// 不能用 [[self deviceVersion] isEqualToString:@"iPhone X"] 来判定,因为魅族 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的可观

图片 9

会发掘尾部 UITabBar 是胜过一些冲天,查看层级关系后意识,一样是出于安全区的原因,UITabBar 中度由49pt形成了83pt,由此这里也要对一加 X 及其模拟器进行适配

3.3:Motorola X 独有 faceID,未有touchID,假设in的行使有利用到 touchID 解锁的地点,这里要基于机型进行对应的适配

3.4:以前有偷懒的直白运用20代替状态栏中度,那些坑都要通过重新取得状态栏高度

       CGRectGetHeight([UIApplication sharedApplication].statusBarFrame)

3.5:但是摩托罗拉 X更加大的坑是荧屏的适配

率先看下显示屏尺寸

图片 10

那张图反映出累累音讯:

索尼爱立信 X的大幅即便和7是同样的,可是中度多出145pt

选择三倍图是至关心注重要,何况貌似认为肉眼所能所能识其他最高的显示屏密度是300ppi,三星X已完毕458ppi(核准发掘三星(Samsung)galaxy连串的显示屏密度是522ppi)

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

图片 11

彰显出来的安插布局需求填满整个荧屏

图片 12

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

图片 13

图片 14

 

林芝区域以外的一些不容许有别的与客户交互的控件

上面那张图内含消息略多

尾部导航栏不予许举行客户交互的,意味着上边那二种景况 Apple 官方是分裂意的

图片 15

图片 16

底层设想区是代表了价值观home键,中度为34pt,通过上海滑稽剧团可呼起多职分管理,思虑到手势冲突,那有的也是不允许有别的可交互的控件,但是设计的背景图要覆盖到非安全区域

情状栏在非安全区域,文书档案中也涉嫌,除非可以经过遮掩状态栏给顾客带来格外的价值,不然最佳把情状栏还给客商

重复使用现存图片时,注意长度宽度比差异。Samsung X 与符合规律 Samsung的荧屏长度宽度比不一致,由此,全屏的 4.7 寸屏图像在 金立 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的部分坑

TAG标签:
版权声明:本文由银河国际点击登录发布于升级网络游戏,转载请注明出处:适配 iOS 11 & iPhone X 大全