针对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 ...
随机推荐
- unity3d连接Sqlite并打包发布Android
连接Sqlite首先要把dll程序集导入到unity3d工程里面.安装好的unity中可以找到
- node.js初识10
post请求 form.html <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- animation 老动画
关于设置跳跃: using System.Collections; using System.Collections.Generic; using UnityEngine; public class ...
- 010-判断是否回传IsPostBack属性
属性IsPostBack:判断是否回传 如果是第一次请求,则返回false 如果是回传请求,则返回true->说明:只有使用服务器端表单才可以正常使用IsPostBack->使用情境:当在 ...
- input 滑块功能range javascript方法使用
<script> var rangelist=document.querySelectorAll('[type="range"]'); for(var i=0; i&l ...
- Rpgmakermv(7) Chronus.js说明与简要翻译
插件地址:https://github.com/triacontane/RPGMakerMV/blob/master/Chronus.js 日语版 ゲーム内で時刻と天候の概念を表現できるプラグインです ...
- 转:安装PHP出现make: *** [sapi/cli/php] Error 1 解决办法
ext/iconv/.libs/iconv.o: In function `php_iconv_stream_filter_ctor':/home/king/PHP-5.2.13/ext/iconv/ ...
- web前端利用turf.js生成等值线、等值面
样例如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...
- highchart应用示例2-上:圆角柱状图,下:多指标曲线图
1.ajax调用接口获取数据 function getCityData() { var date1 = $('#datetimepicker1').val(); var date2 = $('#dat ...
- 多进程wait、僵尸进程、孤儿进程、prctl
1.概念 1.孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,从而保证每个进程都会有一个父进程.而Init进程会自 ...