iOS15适配

作者: 丿星纟彖彳亍 | 来源:发表于2021-11-11 12:09 被阅读0次

    以iOS15和xcode13为环境基础,iOS15适配的一些更改和调整。

    • UINavigationBar
    • UITabBar
    • TableView
    • Image
    • ProMotion
    • CLLocationButton

    UINavigationBar

    用新xcode13编译工程后,导航栏的问题比较明显,调试之后发现是UINavigationBar部分属性的设置在iOS15上是无效的

    • OC:
        // 修改NarBar背景
        if (@available(iOS 15.0, *)) {
            UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init];
            // 背景色
            appearance.backgroundColor = [UIColor blueColor];
            // 去掉半透明效果
            appearance.backgroundEffect = nil;
            // 标题字体颜色及大小
            appearance.titleTextAttributes = @{
                NSForegroundColorAttributeName : [UIColor whiteColor],
                NSFontAttributeName : [UIFont boldSystemFontOfSize:18],
            };
            // 设置导航栏下边界分割线透明
            appearance.shadowImage = [[UIImage alloc] init];
            // 去除导航栏阴影(如果不设置clear,导航栏底下会有一条阴影线)
            appearance.shadowColor = [UIColor clearColor];
            // standardAppearance:常规状态, 标准外观,iOS15之后不设置的时候,导航栏背景透明
            self.navigationBar.standardAppearance = appearance;
            // scrollEdgeAppearance:被scrollview向下拉的状态, 滚动时外观,不设置的时候,使用标准外观
            self.navigationBar.scrollEdgeAppearance = appearance;
        } else {
            navigationBar.setBackgroundImage(UIColor.clear.image, for: .default)
            // 导航栏背景,主题色是绿色
            navigationBar.barTintColor = UIColor.theme
            // 默认不透明
            navigationBar.isTranslucent = false
            // 着色,让返回按钮图片渲染为白色
            navigationBar.tintColor = UIColor.white
            // 导航栏文字
            navigationBar.titleTextAttributes = [
                  NSAttributedString.Key.font: UIFont.systemFont(ofSize: 18),
                 NSAttributedString.Key.foregroundColor: UIColor.white
            ]
        }
    
    • Swift
    if #available(iOS 15, *) {
        let app = UINavigationBarAppearance.init()
        app.configureWithOpaqueBackground()  // 重置背景和阴影颜色
        app.titleTextAttributes = [
            NSAttributedString.Key.font: UIFont.systemFont(ofSize: 18),
            NSAttributedString.Key.foregroundColor: UIColor.white
        ]
        app.backgroundColor = UIColor.theme  // 设置导航栏背景色
        app.shadowImage = UIColor.clear.image  // 设置导航栏下边界分割线透明
        navigationBar.scrollEdgeAppearance = app  // 带scroll滑动的页面
        navigationBar.standardAppearance = app // 常规页面
    }
    

    UITabbar

    tabbar的问题和navigationBar的问题属于同一类,tabbar背景颜色设置失效,字体设置失效,阴影设置失效问题。

    • OC
    // 修改tabbar背景
      if (@available(iOS 15.0, *)) {
            UITabBarAppearance *appearance = [UITabBarAppearance new];
            //tabBar背景颜色
            appearance.backgroundColor = [UIColor whiteColor];
           // 去掉半透明效果
            appearance.backgroundEffect = nil;
           // tabBaritem title选中状态颜色
           appearance.stackedLayoutAppearance.selected.titleTextAttributes = @{
                NSForegroundColorAttributeName:KColorFromRGB(0x53A2F8),
                NSFontAttributeName:[UIFont systemFontOfSize:12],
            };
            //tabBaritem title未选中状态颜色
            appearance.stackedLayoutAppearance.normal.titleTextAttributes =  @{
                NSForegroundColorAttributeName:KColorFromRGB(0x7E7E7E),
                NSFontAttributeName:[UIFont systemFontOfSize:12],
            };
            self.tabBar.scrollEdgeAppearance = appearance;
            self.tabBar.standardAppearance = appearance;
    }
    
    • Swift
    if #available(iOS 15, *) {
        let bar = UITabBarAppearance.init()
        bar.backgroundColor = UIColor.white
        bar.shadowImage = UIColor.init(0xEEEEEE).image
        let selTitleAttr = [
            NSAttributedString.Key.font: itemFont,
            NSAttributedString.Key.foregroundColor: UIColor.theme
        ]
        bar.stackedLayoutAppearance.selected.titleTextAttributes = selTitleAttr // 设置选中attributes
        self.tabBar.scrollEdgeAppearance = bar
        self.tabBar.standardAppearance = bar
    }
    

    UITableview

    iOS15对于tableview,新增了sectionHeaderTopPadding作为列表每个部分标题上方的填充,它的默认值是UITableViewAutomaticDimension,所以我们要将他设置为0,否则当我们的列表设置了section高度的列表会出现head高度增加的情况,适配方式:

    // OC
    if (@available(iOS 15.0, *)) {
        self.tableView.sectionHeaderTopPadding = 0;
    }
    // Swift
    if #available(iOS 15, *) {
        tableView.sectionHeaderTopPadding = 0
    }
    

    Image

    在iOS15中,UIImageWriteToSavedPhotosAlbum存储图片之后的回调不再返回图片了,会返回nil,如果在回调方法里面操作image有可能会直接Crash,目前的解决办法声明一个全局image去记录,后面再去操作:

    self.image = savedImage;
    UIImageWriteToSavedPhotosAlbum(savedImage, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
      
    - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
        // self.image doing...
    }
    

    新增了几个调整尺寸的方法:

    // preparingThumbnail
    UIImage(named: "sv.png")?.preparingThumbnail(of: CGSize(width: 200, height: 100))
    // prepareThumbnail,闭包中直接获取调整后的UIImage
    UIImage(named: "sv.png")?.prepareThumbnail(of: CGSize(width: 200, height: 100)) { image in
        // 需要回到主线程更新UI
    }
    await UIImage(named: "sv.png")?.byPreparingThumbnail(ofSize: CGSize(width: 100, height: 100))
    

    系统图片支持多个层,支持多种渲染模式:

    // preparingThumbnail
    UIImage(named: "sv.png")?.preparingThumbnail(of: CGSize(width: 200, height: 100))
    // prepareThumbnail,闭包中直接获取调整后的UIImage
    UIImage(named: "sv.png")?.prepareThumbnail(of: CGSize(width: 200, height: 100)) { image in
        // 需要回到主线程更新UI
    }
    await UIImage(named: "sv.png")?.byPreparingThumbnail(ofSize: CGSize(width: 100, height: 100))
    

    ProMotion设备配置高刷权限

    iPhone 13 Pro、iPhone 13 Pro Max 和 iPad ProMotion 显示器能够在以下各项之间动态切换:
    刷新率高达 120Hz,低至 24Hz 或 10Hz 的较慢刷新率。

    目前在iPhone 13 Pro 或 iPhone 13 Pro Max 上非官方APP默认不支持120Hz刷新率,其实只需要在Plist上配置以下权限,就可以使用上高刷,而Pad Pro 不需要这种特殊配置,默认支持高刷。

    <key>CADisableMinimumFrameDurationOnPhone</key><true/>
    

    CLLocationButton

    该内容内置于CoreLocationUI模块,但如果需要获取定位的详细信息仍然需要借助于CoreLocation。

    let locationButton = CLLocationButton()
    // 文字
    locationButton.label = .currentLocation
    locationButton.fontSize = 20
    // 图标
    locationButton.icon = .arrowFilled
    // 圆角
    locationButton.cornerRadius = 10
    // tint
    locationButton.tintColor = UIColor.systemPink
    // 背景色
    locationButton.backgroundColor = UIColor.systemGreen
    // 点击事件,应该在在其中发起定位请求
    locationButton.addTarget(self, action: #selector(getCurrentLocation), for: .touchUpInside)
    

    相关文章

      网友评论

        本文标题:iOS15适配

        本文链接:https://www.haomeiwen.com/subject/hagwzltx.html