zoukankan      html  css  js  c++  java
  • 针对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); } }]; }
  • 相关阅读:
    盘符格式转换成NTFS格式
    jdk环境变量配置
    修改mysql密码
    端口占用解决
    程序执行原理
    第一个Python程序
    pip安装第三方库失败的问题
    windows本地安装mongoDB并且安装可视化工具studio 3t
    开发时前端测试方法
    虚拟机配置vimrc
  • 原文地址:https://www.cnblogs.com/developer-qin/p/7273144.html
Copyright © 2011-2022 走看看