针对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); } }]; }
原文地址:https://www.cnblogs.com/developer-qin/p/7273144.html