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的适配的更多相关文章

  1. html小知识点汇总(浏览器导航上显示图标、div无高度时试着清除浮动、文字环绕图片、字体加粗、div按百分比分、已有的不合适的class,针对特定的标签进行修改)

    1.新点击的网页,在浏览器导航上显示图标: 像这种效果: <head> <meta charset="UTF-8"> <meta name=" ...

  2. 在 Xcode 6 中使用矢量图( iPhone 6 置配 UI)

    在 Xcode 6 中使用矢量图( iPhone 6 置配 UI) (本文转载:http://iosdeveloper.diandian.com/post/2014-09-25/40063062789 ...

  3. iOS 11适配和iPhone X的适配

    这两天对自己负责的项目进行iOS 11和iPhone X的适配,网上的博客很多,也看了很多别人的记录博客,这里把自己遇到的问题记录下,当然有些不仅仅是iOS 11和iPhone X的适配,还包括自己遇 ...

  4. iOS:界面适配--iPhone不同机型适配 6/6plus

    iOS:界面适配--iPhone不同机型适配 6/6plus        机型变化 坐标:表示屏幕物理尺寸大小,坐标变大了,表示机器屏幕尺寸变大了: 像素:表示屏幕图片的大小,跟坐标之间有个对应关系 ...

  5. 【转】使用Xcode中的iOS SDK给iphone开发出第一个App程序

    之前已经折腾过用Xcode开发OS X的程序了,现在继续折腾,用iOS SDK开发移动设备(iphone/ipad/ipod touch)的程序. 1.从iOS Developer Library中找 ...

  6. 针对Xcode的警告忽略消除处理

    一.问题描述 html代码如下 <html> <head> <meta charset="utf-8"/> <title>我的网页& ...

  7. Python全栈day21(作业针对一个文件进行查询修改删除的操作练习)

    需求,有一个配置文件test.conf内容如下 backend www1 server 1 server 2 backend www2 server 3 server 4 add [{'backend ...

  8. Xcode真机运行报错iPhone has denied the launch request

    1.打开钥匙串 ->Apple Worldwide Developer Relations Certification Authority ->双击 并点击信任->选择使用系统默认2 ...

  9. iPhone 6 & iPhone 6 Plus适配

    转载请注明出处: http://www.cnblogs.com/dokaygang128/p/4049461.html Apple 今年发布了两款新的iPhone机器,iPhone 6 和iPhone ...

随机推荐

  1. unity3d连接Sqlite并打包发布Android

    连接Sqlite首先要把dll程序集导入到unity3d工程里面.安装好的unity中可以找到

  2. node.js初识10

    post请求 form.html <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  3. animation 老动画

    关于设置跳跃: using System.Collections; using System.Collections.Generic; using UnityEngine; public class ...

  4. 010-判断是否回传IsPostBack属性

    属性IsPostBack:判断是否回传 如果是第一次请求,则返回false 如果是回传请求,则返回true->说明:只有使用服务器端表单才可以正常使用IsPostBack->使用情境:当在 ...

  5. input 滑块功能range javascript方法使用

    <script> var rangelist=document.querySelectorAll('[type="range"]'); for(var i=0; i&l ...

  6. Rpgmakermv(7) Chronus.js说明与简要翻译

    插件地址:https://github.com/triacontane/RPGMakerMV/blob/master/Chronus.js 日语版 ゲーム内で時刻と天候の概念を表現できるプラグインです ...

  7. 转:安装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/ ...

  8. web前端利用turf.js生成等值线、等值面

    样例如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...

  9. highchart应用示例2-上:圆角柱状图,下:多指标曲线图

    1.ajax调用接口获取数据 function getCityData() { var date1 = $('#datetimepicker1').val(); var date2 = $('#dat ...

  10. 多进程wait、僵尸进程、孤儿进程、prctl

    1.概念 1.孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,从而保证每个进程都会有一个父进程.而Init进程会自 ...