0
点赞
收藏
分享

微信扫一扫

(转)[IOS]iPhone X适配参考




随着iOS11和xcode9刚开始正式发布,小编也迫不及待的更新了xcode9,手机也顺利更新到iOS,也终于见到iPhone X 的真面不,看着​​齐刘海​​的样式,小编心里淡淡的忧伤,怎么适配,如何快速适配到项目中,成了一个蛋疼的问题

文章讲解点:

  • 1.首先看一下iPhone X的模拟器样式吧
  • 2.iPhone X的设计图
  • 3.启动页的适配
  • 4.刷新框架的适配iOS11
  • 5.纯代码的宽高比适配
  • 6.纯代码适配齐刘海
  • 7.纯代码适配iPhone X脚底
  • 8.xib和SB适配
  • 9,适配iOS 11 列表的册数删除
  • 10.tableView的头部试图和尾部试图
  • 11.UIBarButtonItem的适配
  • 12.无线真机测试
  • 13.真机地图适配

友情链接:

  • ​​CALyer解读--总有一个点会让你想起它​​
  • ​​2017年iOS面试题总结​​
  • ​​iOS开发个人开发账号的证书详细使用及介绍​​
  • ​​自定义XIB View里面添加其他自定义Xib View​​
  • ​​swift里面的数组你真的学会了吗​​

1.首先看一下iPhone X的模拟器样式吧



 




(转)[IOS]iPhone X适配参考_iPhone X适配


我是iPhone X


​xcode 9 模拟器都带一个套套,像我这种强迫症看着淡淡的忧伤,没办法直接干掉算了​​​​如果看着大小在电脑上面不合适,就把鼠标放到四个角的时候,可以随便拖大小的​



(转)[IOS]iPhone X适配参考_iphone_02


更改模拟器外观样式.png


2.iPhone X的设计图

(转)[IOS]iPhone X适配参考_iphone_03


 


3.启动页的适配

iPhone X采用的和iPhone 6p一样的​​@3x​​​的图,而不是传说中的​​@4x​​​图,不然设计​​妹妹​​​真的哭晕在厕所了,适配起来还是比较好弄的,但是iPhone X 的屏幕平尺变为​​1125 * 2436​​​,如果你是用的是​​LaunchImage​​​来管理启动页,那就可以找设计​​妹子​​​给你弄一张图出来了(晚上一起吃饭不,那就看你本事了)。如果你使用的是​​LaunchScreen​​​来适配的启动页,听我一句也去问问设计妹子吧,毕竟iPhone X的​​高宽比(iPhone X采用了iPhone 8的宽,却比iPhone 8p都要高)​​​发生了变化,拉伸了设计​​妹子​​​的图,会给你拼命的,
说的那么多废话,就一点是重要的iPhone X 的屏幕平尺变为1125 * 2436

4.刷新框架的适配iOS11

如果你使用了​​MJRefresh​​等刷新,并且你还隐藏了导航,那么你就会出现一下情况


(转)[IOS]iPhone X适配参考_ios_04


造成这个原因就是:​​iOS 11​​​上面废除了​​automaticallyAdjustsScrollViewInsets​​​这个属性的使用,妹妹的搞什么,确实使用了​​UIScrollView's contentInsetAdjustmentBehavior​​​来替代,​​详细介绍​​(本篇七秒只做开发中实际适配,不详细解答为何这样适配),如何适配?粘上下面代码即可

if (@available(iOS 11.0, *)) {
self.home_collectionView.contentInsetAdjustmentBehavior = UIApplicationBackgroundFetchIntervalNever;
} else {
self.automaticallyAdjustsScrollViewInsets = false;
// Fallback on earlier versions

但是看到每个地方倒要​​if else​​,确实不舒服,七秒斗胆写了一个宏,仅供参考


/// 第一个参数是当下的控制器适配iOS11 一下的,第二个参数表示scrollview或子类 
#define AdjustsScrollViewInsetNever(controller,view) if(@available(iOS 11.0, *)) {view.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;} else if([controller isKindOfClass:[UIViewController class]]) {controller.automaticallyAdjustsScrollViewInsets = false;}

 

(转)[IOS]iPhone X适配参考_iphone_05


适配后的界面,舒服多了


 


5.纯代码的宽高比适配

众所周知​​iPhone X​​​的高宽比和以前的​​iPhone​​​机型有所改变,那么我们纯代码适配,都是使用的系数进行适配,如:​​CGRectMake(20*kWJWidthCoefficient, 30*kWJHeightCoefficient, 100*kWJWidthCoefficient, 40*kWJHeightCoefficient)​​​这样就可以适配使用的机型了,但是偏偏​​iPhone X​​​上面宽度没有变,高度却增加不少,没办法只能在​​kWJHeightCoefficient​​​系数来做文章吧,七秒没办法只能在写个宏了不然,我的一个个的写啊,累啊
说了那么多废话,其实就是iPhone X的高宽比和iPhone 8的一样就OK,但是​iPhone X​确实用的是​@3x​的图


/// 高度系数 812.0 是iPhoneX的高度尺寸,667.0表示是iPhone 8 的高度,如果你觉的它会变化,那我也很无奈 
#define kWJHeightCoefficient (kWJScreenHeight == 812.0 ? 667.0/667.0 : kWJScreenHeight/667.0)


6.纯代码适配​​齐刘海​

众所周知,​​导航的高度为64​​​,在哪个手机上面都是不变的,​​iPhone X​​​没出来之前是对的,随便写​​64​​​,​​iPhone X​​​出来后,大家都傻眼了,导航栏高度变了有可能为​​88​​​,傻眼了吧,如果你纯码写的都是​​64​​效果如下

(转)[IOS]iPhone X适配参考_纯代码_06



这就是自己写代码的不规范造成的,曾经有个 ​​程序员​​​给说过:不要在代码里面看到 ​​重复多次的数字、字符串等​​​的使用,如果重复多次就要抽取出来使用常量来表示,如果当时听他的话,能出现这个效果,吓的小遍立马改为(现在已经哭晕厕所)
重点 :别直接写 ​​64​​​了,也别直接写 ​​88​​​,写宏吧
重点:别直接写 ​​64​​​了,也别直接写 ​​88​​​,写宏吧
重点:别直接写 ​​64​​​了,也别直接写 ​​88​​,写宏吧


#define SafeAreaTopHeight (kWJScreenHeight == 812.0 ? 88 : 64)


9,适配iOS 11 列表的册数删除

在iOS8之后,苹果官方增加了UITableVIew的右滑操作接口,即新增了一个代理方法(tableView: editActionsForRowAtIndexPath:)和一个类(UITableViewRowAction),代理方法返回的是一个数组,我们可以在这个代理方法中定义所需要的操作按钮(删除、置顶等),这些按钮的类就是UITableViewRowAction。这个类只能定义按钮的显示文字、背景色、和按钮事件。并且返回数组的第一个元素在UITableViewCell的最右侧显示,最后一个元素在最左侧显示。从iOS 11开始有了一些改变,首先是可以给这些按钮添加图片了,然后是如果实现了以下两个iOS 11新增的代理方法,将会取代(tableView: editActionsForRowAtIndexPath:)代理方法:
注意:看的有的文章如果在iOS11上面调用老的删除,会崩溃,小编测试没有遇到,还是请大家趁早替换适配吧


- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?


9.1,右滑和左滑调用

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { let action = UIContextualAction(style: .destructive, title: "Delete") { (action, view, handler) in handler(true) } let configuration = UISwipeActionsConfiguration(actions: [action]) return configuration } func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { let action = UIContextualAction(style: .normal, title: "Mark") { (action, view, handler) in handler(true) } action.backgroundColor = UIColor.init(red: 254/255.0, green: 175/255.0, blue: 254/255.0, alpha: 1); let configuration = UISwipeActionsConfiguration(actions: [action]) return configuration }

 


10.tableView的头部试图和尾部试图

在iOS11里面有时候在​​tableView​​​的头部和尾部留白,因为苹果给滚动试图加进去了​​self-sizeing​​​,开始计算逐步计算​​contentSize​​​,默认如果不去实现​​viewForHeaderInSection​​​就不会调用​​heightForHeaderInSection​​,尾部试图一样。


func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { } func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 0.001 }


如果你不想实现 ​​viewForHeaderInSection​​​也不想留白,那么只需要你把 ​​self-sizeing​​自动估高关闭即可


/// 自动关闭估算高度,不想估算那个,就设置那个即可 
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;


11.UIBarButtonItem的适配

UIBarButtonItem错位效果:

(转)[IOS]iPhone X适配参考_iphone_07

 在iOS 11 里面使用 ​​CustomView​​​创建的​​item​​​造成​​frame​​​错乱以及设置边距​​item.width = -20​​​等失效问题,归根结底是因为​​苹果更改了iOS11上面uinavigationBar的结构​

iOS 11以前的navigationBar:

(转)[IOS]iPhone X适配参考_iPhone X适配_08

添加的​​right和left​​​直接添加到​​navigationBar上面​​,并且使用的是frame布局的

iOS 11 navigationBar结构图:

(转)[IOS]iPhone X适配参考_纯代码_09


有图我们可以看到, 添加的 ​​right和left​​​的 ​​UIBarButtonItem​​​并不是直接添加到 ​​nagitionBar​​​上面。而是在外面嵌套了一个 ​​uibuttonBarStackView​​​,而 ​​StackView​​​并不是使用的 ​​frame​​,而是用的约束来布局,所以必须得用 AutoLayout 了!


/// 适配iOS11 UIBarButtonItem 添加自定义布局 
if (@available(iOS 9.0,*)) {
/// 强迫症的朋友这里也是可以写成11.0
[backbtn.widthAnchor constraintEqualToConstant:size.width].active = true;
[backbtn.heightAnchor constraintEqualToConstant:size.height].active = true; }



(转)[IOS]iPhone X适配参考_iphone_10


12.无线真机测试


这应该也是 ​​xcode 9​​的一个亮点吧,但是速度真的不是很干恭维的。 注意手机和电脑必须在同一个局域网内
首先使用手机连接xcode之后,打开 ​​​window->Devices and Simulator->勾选Show as run destination和Connect via network​​,这样就可以无线测试了,以后妈妈再也不用担心忘记带线了


(转)[IOS]iPhone X适配参考_ios_11



(转)[IOS]iPhone X适配参考_ios_12


13.iOS11 真机地图


在iOS11地图适配,在iOS11中,如果使用到地图,我们就需要在 ​​info​​​,里面添加 ​​NSLocationAlwaysAndWhenInUseUsageDescription​​​ 和 ​​NSLocationWhenInUseUsageDescription​​​才可以在 ​​ios11​​里面正常调出地图



(转)[IOS]iPhone X适配参考_纯代码_13


举报

相关推荐

ios适配

0 条评论