针对Xcode 9 + iOS11 的修改,及iPhone X的适配
1,UIScrollView的automaticallyAdjustsScrollViewInsets 失效了。
automaticallyAdjustsScrollViewInsets,当设置为YES时(默认YES),如果视图里面存在唯一一个UIScrollView或其子类View,那么它会自动设置相应的内边距,这样可以让scroll占据整个视图,又不会让导航栏遮盖。
iOS11这个属性失效了,表现在App的现象就是TableHeaderView的背景图原本覆盖导航栏的,现在在导航栏的下方。
这是因为iOS 11为UIScrollView 添加了新的属性contentInsetAdjustmentBehavior 这是一个枚举。
修改代码如下:
if (@available(iOS 11.0, *)) {
self.centerTable.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
self.automaticallyAdjustsScrollViewInsets = NO;
}
2, 相册读取权限
iOS11下,苹果对相册的权限key做了调整,原来的 NSPhotoLibraryUsageDescription ,在iOS11之后,改成了NSPhotoLibraryAddUsageDescription。
<key>NSPhotoLibraryAddUsageDescription</key> //iOS 11
<string>App需要您的同意,才能访问相册</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>App需要您的同意,才能访问相册</string> //<iOS10
3,导航栏
iOS11对导航栏做了比较大的更改;
表现一,以前使用如下方法设置导航栏UIBarButtonItem。到了iOS11上。UIBarButtonItem会被Tint Color渲染,原油颜色被冲掉。
解决方法 : 设置UIImage的渲染模式——UIImage.renderingMode为 UIImageRenderingModeAlwaysOriginal——始终绘制图片原始状态,不使用Tint Color。
UIImage *backImage = [[UIImage imageNamed:image] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
//设置导航栏返回按钮,iOS11上颜色会被冲掉
- (void)setNavigationBarBackButtonItem:(NSString *)image
{
UIImage *backImage = [UIImage imageNamed:image];
UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithImage:backImage style:UIBarButtonItemStylePlain target:self action:@selector(popViewControllerAnimated)];
backItem.tintColor = [UIColor colorWithPatternImage:backImage];
backItem.title = @"";
self.navigationItem.leftBarButtonItem = backItem;
}
用 initWithCustomView的方法,赋一个Button上去,不会用这个受上面影响。
_leftBtn = [[UIButton alloc] ];
[_leftBtn setImage:image forState:UIControlStateNormal];
_leftBtn.backgroundColor = [UIColor cyanColor];
_leftBtn.imageView.contentMode = UIViewContentModeScaleAspectFit;
_leftBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
[_leftBtn addTarget:self action:@selector(leftBtnClicked) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:_leftBtn];
self.navigationItem.leftBarButtonItem = leftBarButtonItem;
表现二,iOS11上initWithCustomView的方法给导航栏设置按钮,如果图片未加@3x后缀,图片会显示超大,超出了原始尺寸。
解决方法就是给图片加上@3x。
4,iPhone X适配
iPhone X竖屏时占满整个屏幕的控制器的view的safeAreaInsets是(44,0,34,0),横屏是(0,44,21,44),inset后的区域正好是safeAreaLayoutGuide区域
1)LaunchImage————添加启动图片
{ "extent" : "full-screen", "idiom" : "iphone", "subtype" : "2436h", "filename" : "LaunchImage-1125*2436@3x.jpg", "minimum-system-version" : "11.0", "orientation" : "portrait", "scale" : "3x" }
2),顶部动态获取状态栏和标题栏的高度
//为适配iPhone X,动态获取状态栏和标题栏的高度
- (CGFloat)heightAboveSafeArea
{
//状态栏
CGRect statusRect = [[UIApplication sharedApplication] statusBarFrame];
//标题栏
CGRect navRect = self.navigationController.navigationBar.frame;
CGFloat heightOffset = statusRect.size.height + navRect.size.height;
return heightOffset;
}
3),底部按钮交互在safeArea之外了,需要上移34pt
做法:添加contentView,底部按钮以contentView 作为依赖即可
//viewdidload中加
WS(ws);
[self.contentView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(ws.view).priorityLow();
}]; /**
用来适配iPhone X
底部控件直接以ContentView为依赖
@return vivien add
*/
- (UIView *)contentView
{
if(!_contentView){
_contentView = [[UIView alloc]init];
[self.view addSubview:_contentView];
}
return _contentView;
} //
- (void)viewLayoutMarginsDidChange {
[super viewLayoutMarginsDidChange];
WS(ws);
[self.contentView mas_remakeConstraints:^(MASConstraintMaker *make) {
if ([UIDevice currentDevice].systemVersion.floatValue >= 11.0) {
make.edges.equalTo(ws.view).insets(ws.view.safeAreaInsets);
} else {
make.edges.equalTo(ws.view);
}
}];
}
针对Xcode 9 + iOS11 的修改,及iPhone X的适配的更多相关文章
- html小知识点汇总(浏览器导航上显示图标、div无高度时试着清除浮动、文字环绕图片、字体加粗、div按百分比分、已有的不合适的class,针对特定的标签进行修改)
1.新点击的网页,在浏览器导航上显示图标: 像这种效果: <head> <meta charset="UTF-8"> <meta name=" ...
- 在 Xcode 6 中使用矢量图( iPhone 6 置配 UI)
在 Xcode 6 中使用矢量图( iPhone 6 置配 UI) (本文转载:http://iosdeveloper.diandian.com/post/2014-09-25/40063062789 ...
- iOS 11适配和iPhone X的适配
这两天对自己负责的项目进行iOS 11和iPhone X的适配,网上的博客很多,也看了很多别人的记录博客,这里把自己遇到的问题记录下,当然有些不仅仅是iOS 11和iPhone X的适配,还包括自己遇 ...
- iOS:界面适配--iPhone不同机型适配 6/6plus
iOS:界面适配--iPhone不同机型适配 6/6plus 机型变化 坐标:表示屏幕物理尺寸大小,坐标变大了,表示机器屏幕尺寸变大了: 像素:表示屏幕图片的大小,跟坐标之间有个对应关系 ...
- 【转】使用Xcode中的iOS SDK给iphone开发出第一个App程序
之前已经折腾过用Xcode开发OS X的程序了,现在继续折腾,用iOS SDK开发移动设备(iphone/ipad/ipod touch)的程序. 1.从iOS Developer Library中找 ...
- 针对Xcode的警告忽略消除处理
一.问题描述 html代码如下 <html> <head> <meta charset="utf-8"/> <title>我的网页& ...
- Python全栈day21(作业针对一个文件进行查询修改删除的操作练习)
需求,有一个配置文件test.conf内容如下 backend www1 server 1 server 2 backend www2 server 3 server 4 add [{'backend ...
- Xcode真机运行报错iPhone has denied the launch request
1.打开钥匙串 ->Apple Worldwide Developer Relations Certification Authority ->双击 并点击信任->选择使用系统默认2 ...
- iPhone 6 & iPhone 6 Plus适配
转载请注明出处: http://www.cnblogs.com/dokaygang128/p/4049461.html Apple 今年发布了两款新的iPhone机器,iPhone 6 和iPhone ...
随机推荐
- dotnet 命令
以下用实例串起dotnet常用命令,带你玩转dotnet命令. 1.创建(dotnet new) 首先我们创建一个项目,这里我们创建控制台程序,命令如下图所示. dotnet new dotnet n ...
- Oracle中找出用户的上次登录时间
可以使用如下sql语句: select t1.username,t1.logon_time last_logon_time,t2.account_status,created 账号创建时间 from ...
- 11.match
(我对部分段落进行翻译) A match statement is used to branch execution of a program. It’s the equivalent of the ...
- plsql连接远程oracle数据库
1.在oracle安装目录D:\app\Eric\product\11.2.0\dbhome_1\NETWORK\ADMIN找到tnsnames.ora:2.ORCL =(DESCRIPTION = ...
- Java volatile详解
转自:http://www.cnblogs.com/dolphin0520/p/3920373.html volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受 ...
- 浅谈大数据与hadoop家族
按照时间的早晚从大数据出现之前的时代讲到现在.暂时按一个城市来比喻吧,反正Landscape的意思也大概是”风景“的意思. 早在大数据概念出现以前就存在了各种各样的关于数学.统计学.算法.编程语言的研 ...
- 20165316 2017-2018-2《Java程序设计》课程总结
20165316 2017-2018-2<Java程序设计>课程总结 一.每周作业链接汇总 1. 预备作业一:我期望的师生关系 20165316 我期望的师生关系 摘要: 典型老师 师生关 ...
- Selenium自动化测试,接口自动化测试开发,性能测试从入门到精通
Selenium自动化测试,接口自动化测试开发,性能测试从入门到精通Selenium接口性能自动化测试基础部分:分层自动化思想Slenium介绍Selenium1.0/2.0/3.0Slenium R ...
- UVA 11584 Partitioning by Palindromes (字符串区间dp)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- SQL数据同步之发布订阅
发布订阅份为两个步骤:1.发布.2.订阅.首先在数据源数据库服务器上对需要同步的数据进行发布,然后在目标数据库服务器上对上述发布进行订阅.发布可以发布一张表的部分数据,也可以对整张表进行发布.下面分别 ...