适配ios13

2023-11-03

更新Xcode之后,新项目需求,新建项目发现多了如图1所示两个新的文件SceneDelegate.h和SceneDelegate.m

运行之后发现黑屏,无论是真机还是模拟器都不行,换到iOS12的手机上则可以正常运行。

查看官方文档,SceneDelegate是为了优化启动和实现iPad多任务处理功能(在ipad上同时打开多个窗口)做出的改动,将原本在AppDelegate里的生命周期相关方法和window分离出来

iOS13以前:AppDelegate管理App的生命周期和UI生命周期;

iOS13以后:AppDelegate管理App的生命周期和新增的UISceneSession生命周期,
                   新增SceneDelegate文件来管理UI生命周期和window;

关于解决有两种情况:

不支持多窗口的APP
1)将新增的SceneDelegate文件删除
2)删除info.plist文件中Application Scene Manifest选项,如下图所示

3)在AppDelegate中新增window属性,在didFinishLaunchingWithOptions方法中跟往常一样进行相应根控制设置及处理,并删除新增的UISceneSession两个方法

支持多窗口 && 适配13以下

2、需要用到SceneDelegate进行开发或不想删除该文件,且需要适配iOS13以前的版本。
解决核心:添加版本控制

1)AppDelegate中增加window属性,在didFinishLaunchingWithOptions方法中用if (@available(iOS 13.0, *)){}进行版本控制,UISceneSession lifecycle里的两个方法也要添加版本控制,如下图所示

(因为在iOS13以前的系统中,没有SceneDelegate文件,所以还是需要在AppDelegate方法中进行根控制的设置)

2)在SceneDelegate中willConnectToSession方法里进行根控制设置的时候也要添加相应的版本控制,需要注意的是,初始化window的时候需要用WindowScene进行初始化,否则黑屏加载不出视图。

2)在支持SceneDelegate的APP中,初始化window必须设置UIWindowScene *windowScene,

如果为nil,window将不会出现。

使用QQ的三方登录,在手机没有安装QQ的情况下,QQSDK会使用webView进行登录,QQSDK会创建一个新的window,这个window没有设置windowScene,会导致无法出现在屏幕上。

解决方案有2种:

  1. 关掉QQ的web登录功能,检测手机有没有安装QQ,没有安装QQ,就不显示QQ登录
  2. 使用runtime hook window的initWithFrame方法,在hook方法中给window.windowScene 赋值

其他适配问题:

1、使用presentViewController推出页面,不会全屏,如图

原因:在iOS13之前,VC的modalPresentationStyle属性默认值为UIModalPresentationFullScreen,而在iOS13中改为了UIModalPresentationAutomatic
解决:设置vc.modalPresentationStyle = UIModalPresentationFullScreen;

2、私有KVC使用崩溃
运行之前项目突然崩溃,定位到UITextField 的Placeholder文字颜色设置

[self.phoneTextField setValue:[UIColor colorWithHexString:@"#888888"] forKeyPath:@"_placeholderLabel.textColor"];
[self.passwordTextField setValue:[UIColor colorWithHexString:@"#888888"] forKeyPath:@"_placeholderLabel.textColor"];
[self.registeTextField setValue:[UIColor colorWithHexString:@"#888888"] forKeyPath:@"_placeholderLabel.textColor"];

有两种解决方案:

//方法1:去掉下划线访问placeholderLabel
[self.phoneTextField setValue:[UIColor blueColor] forKeyPath:@"placeholderLabel.textColor"];
[self.phoneTextField setValue:[UIFont systemFontOfSize:20] forKeyPath:@"placeholderLabel.font"];
//方法2:改为修改并赋值属性字符串
NSMutableAttributedString * attributeStr = [[NSMutableAttributedString alloc] initWithString:@"请输入手机号" attributes:@{NSForegroundColorAttributeName : [UIColor redColor], NSFontAttributeName : [UIFont systemFontOfSize:14.0f]}];
self.phoneTextField.attributedPlaceholder = attributeStr;

3、隐藏tabbar上方黑色横线
由于之前的[UIImage new]方法已经不奏效,且在iOS13之后引入了UITabBarAppearance,所以需要修改为

//去除顶部横线
    if (@available(iOS 13.0, *)) {
        UITabBarAppearance * tabbarAppearance = self.standardAppearance;
        tabbarAppearance.shadowImage = [UIImage imageWithColor:[UIColor clearColor]];
        tabbarAppearance.backgroundImage = [UIImage imageWithColor:[UIColor clearColor]];
        self.standardAppearance = tabbarAppearance;
    } else {
        [self setBackgroundImage:[UIImage imageWithColor:[UIColor clearColor]]];
        [self setShadowImage:[UIImage imageWithColor:[UIColor clearColor]]];
    }

其中[UIImage imageWithColor:[UIColor clearColor]是自定义UIImage分类方法 -- 根据颜色生成图片方法,self为继承于UITabBar的自定义tab,如果引入相应不同项目的时候需要自己做相应改动。附上根据颜色生成图片的方法:

#import "UIImage+LSImageWithColor.h"
@implementation UIImage (LSImageWithColor)

+ (UIImage *)imageWithColor:(UIColor *)color {
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return image;
}

@end

4、UIWebView彻底弃用
iOS13上,苹果在UIWebView的使用上明确标注了仅支持iOS2~iOS12的系统,项目中有用到UIWebView的需要全部替换成WKWebView,如果需要适配 iOS 7 的可以通过 openURL 的方式在 Safari 打开。如果没有修改,提交审核将会不通过!

5、暗黑适配
1、图片适配
如果项目中有需要适配暗黑模式的图片,可以在Assets.xcassets中设置,具体需要什么样式自己根据项目情况设置

2、UIColor适配
iOS13之后UIColor增加了两个初始化方法来动态创建UIColor:

//类方法
+ (UIColor *)colorWithDynamicProvider:(UIColor * (^)(UITraitCollection *traitCollection))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchOS);
//实例方法
- (UIColor *)initWithDynamicProvider:(UIColor * (^)(UITraitCollection *traitCollection))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);

当系统切换模式的时候,会自动触发这两个方法来动态修改控件颜色,所以可以根据需要使用这两种方法来进行颜色设置,一般写在基类或者UIColor分类中。

//UIColor分类中增加方法
+ (UIColor *)colorWithLightColor:(UIColor *)color withDarkColor:(UIColor *)darkColor{
    if (@available(iOS 13.0, *)) {
       UIColor *dyColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull traitCollection) {
            if (traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
                return darkColor;
            }
            return color;
        }];
        return dyColor;
    }
    return color;
}

//调用
self.view.backgroundColor = [UIColor colorWithLightColor:[UIColor whiteColor] withDarkColor:[UIColor blackColor]];

iOS13之后系统也提供了一些动态的颜色,如果直接设置提供的那些动态颜色,则不需要使用上面的方法,照常直接设置即可,系统会自动更改颜色,如:labelColor,systemBrownColor等。

3、CGColor适配
CGColor在iOS13之后依然只能表示一种颜色,所以在切换模式后直接返回当前页面时,设置的CGColor并不会动态改变,此时需要调用监听模式切换的方法:
在用到CGColor的VC中重写-(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection方法,将layer颜色设置重新写一遍

-(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection{
    [super traitCollectionDidChange:previousTraitCollection];
    self.logoutBtn.layer.borderColor = [UIColor colorWithHexString:@"#d6d7dc" withDarkHexString:@"#000000"].CGColor;
}

注:这个方法是重写一遍layer颜色设置,而不是只在该方法中设置颜色,因为该方法是在切换模式的时候触发,如果没有切换模式,也没有在其他地方设置颜色,那么你将得不到颜色。

4、设置单个VC的模式

if (@available(iOS 13.0, *)) {
        [self setOverrideUserInterfaceStyle:UIUserInterfaceStyleDark];
    } else {

    }

仅限于当前VC,推出或返回的VC依然是跟随系统模式。

iOS系统暗黑模式

7、关于LaunchImage
wwdc2019中说在2020年4月之后,所有支持iOS13的App必须提供LaunchScreen.storyboard,否则无法提交到 App Store。
设置步骤:
1)将启动图拖入Assets.xcassets中
2)在LaunchScreen.storyboard中拖入ImageView,设置全屏约束,设置图片,完成
注意:
1)如果运行没有出现启动图,是因为缓存问题,删除App重新运行,再不行,重启模拟器即可
2)真机使用Xcode安装了app,设置启动页之后上传AppStore审核通过,在AppStore下载app之前最好先卸载掉原先的,否则会出现启动页虽然能成功显示,但是在显示之前还有一小段时间显示白屏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

适配ios13 的相关文章

  • Swift 闭包作为 AnyObject

    我尝试使用这个方法 class addMethod 在 Obj c 中使用如下 class addMethod self class selector eventHandler imp implementationWithBlock han
  • 两者都实现了类。将使用两者之一

    我有一个项目 它具有使用 SocketRocket 的依赖项 通过 CocoaPods 安装 并从 HeapAnalytics 导入了静态库 显然 HeapAnalytics 库已经使用了 SocketRocket 编译时没有出现错误 但在
  • CBPeripheral 名称有时为 null

    我正在开发一个应用程序来与蓝牙 LE 外围设备进行通信 我目前正在测试的外围设备是其中之一these http www ti com tool cc2540dk mini 有趣的是 有时当我发现它时 我会得到它的正确名称 SimpleBLE
  • 迁移到 ARC 时如何解决“选择器'performSelector:withObject:afterDelay:'没有已知的实例方法”?

    ARC 迁移工具在开始迁移之前拒绝接受此代码 self delegate performSelector selector overlayDismissed withObject self afterDelay 0 委托被迫使用协议来实现此
  • 如何在 UICollectionView 的节标题中动态添加标签和按钮?

    请帮助我如何水平添加标签和水平添加类似的按钮 但每个按钮应像另一个部分一样在每个标签的下方对齐 这应该在 UICollectionView 的标题中动态发生 因为标签和按钮的数量根据我的数据 我想制作一种 Excel 类型的布局 并在标题中
  • 使用 NSURLSessionDataTask 显示文件下载进度

    我想显示特定文件的文件下载进度 收到了多少字节 它与 NSURLSessionDownloadTask 配合得很好 我的问题是我想用 NSURLSessionDataTask 实现同样的效果 以下是将文件接收到 NSData 并写入文档文件
  • iOS - NSNotificationCenter 多个UIKeyboard通知

    我有两个视图控制器 我们称它们为 A 和 B 1 在 A 中 我显示一个包含文本字段的 popOver 2 B中有一个UITextView用于简单的文本编辑 我必须管理 A 和 B 中的键盘才能滚动键盘隐藏的内容 我知道如何重新定位内容 我
  • Swift 3 错误:[_SwiftValue pointSize] 无法识别的选择器发送到实例

    我刚刚将我们的项目迁移到 swift 3 发现由于一个问题导致大量崩溃 由于未捕获的异常 NSInvalidArgumentException 而终止应用程序 原因 SwiftValue pointSize 发送到实例的无法识别的选择器 该
  • 暂停视频录制[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试创建一个应用程序 用户可以在其中从相机录制视频 该应用程序的功能之一必须是文件录制中的暂停 例如 用户通过按 开始 按钮开始
  • iOS 11 安全区域布局指南向后兼容性

    启用安全区域布局指南是否与 iOS 11 以下版本兼容 我设法使用新的安全区域布局指南并保持与 iOS 9 和 iOS 10 的向后兼容性 编辑 正如 NickEntin 的评论所指出的 此实现将假定存在状态栏 但在 iPhone X 的横
  • ITMS-90535 无法使用最新的 Google Signin SDK 发布 iOS 应用程序

    我正在使用 xcode 7 GM 种子并通过 cocoapods 安装了最新的 Google Signin SDKpod Google SignIn 当我尝试将我的应用程序发布到苹果应用程序商店时 我收到附加错误 Help 以下是 Goog
  • 如何检测Retina高清显示屏?

    UIScreen有一个新的 nativeScaleiOS 8 中的属性 但文档没有提及它 property nonatomic readonly CGFloat nativeScale 还有一个scale属性 但文档说它是 2 用于视网膜显
  • iOS 8 中的 UISplitViewController 状态恢复

    在 iOS 8 上 UISplitViewController 似乎可以保存和恢复其子视图的状态 例如 主视图是否隐藏 这是不可取的 因为我的应用程序应该始终以横向方式显示主视图 并始终以纵向方式隐藏它 如果用户以横向模式关闭应用程序 保存
  • iOS UIButton 带有圆角和背景 bug

    我发现圆形 UIButton 存在一个奇怪的问题 这是我创建此按钮的代码块 let roundedButton UIButton type System roundedButton frame CGRectMake 100 100 100
  • 在 Swift 中自动移动 UISlider

    我想在按下按钮时将 UISlider 从 minValue 循环移动到 maxValue 并在再次按下按钮时将其停止在当前位置 我想使用 Swift 我遇到的主要问题是函数 slider setValue 太快了 我希望动画更慢 IBAct
  • 如何使用 Swift 获取 YouTube 频道的所有播放列表?

    我的问题不是关于从一般频道检索视频 我只想获取该频道创建的所有 播放列表 并检索每个播放列表的缩略图 标题和视频数量 这是一个 YouTube 频道示例 正如您所看到的 有很多已创建的播放列表 截至目前 我只能获取某个频道最新上传的视频 在
  • 混合静态和动态 UITableViewController 内容会导致 NSRangeException

    我一直在寻找这个错误 并找到了一些具有类似行为的帖子 但没有解决问题的解决方案 我有一个 UITableViewController 在 SB 中声明为静态 它具有以下部分 第 0 部分 配方 是静态的 有 4 个单元格 第 1 部分 口味
  • 使用 UIImageJPEGRepresentation 时,compressionQuality 应该是多少?

    我想对用户库中的照片应用滤镜 然后将其写回磁盘 我在用着UIImageJPEGRepresentation 该函数需要一个UIImage and a compressionQuality值介于 0 0 和 1 0 之间 因为我想保留原始质量
  • 我什么时候应该对 IBOutlet 使用弱或强限定符? [复制]

    这个问题在这里已经有答案了 可能的重复 ARC 下 IBOutlets 应该强还是弱 https stackoverflow com questions 7678469 should iboutlets be strong or weak
  • 应用程序未通过协同设计验证?

    我在提交 iPhone 申请时遇到问题 我看到了一些类似的问题 但没有找到答案 当我存档项目并单击 验证 时 收到错误消息 应用程序未通过协同设计验证 签名无效 或者未使用 Apple 提交证书进行签名 我假设我在协同设计部分做错了什么 我

随机推荐

  • 操作符浅解

    1 移位操作符 作用的对象是数的二进制位 1 gt gt 向左边移动一位 左边丢弃 右边补0 相当于这个数乘以2移动n位 相当于乘以2的n次方 int main int a 2 int b a lt lt 1 打a的二进制向左移动一位 pr
  • vulnhub靶机练习-Me and My Girlfriend: 1

    vulnhub靶机练习 Me and My Girlfriend 1 靶机下载地址 https www vulnhub com entry me and my girlfriend 1 409 点击直接下载 靶机介绍 Description
  • 安达发

    APS Advanced Planning and Scheduling 先进计划与排程 是一种集成了生产计划 物料需求计划 MRP 库存控制和车间调度等功能的管理系统 在制造业中 物料清单 BOM 管理是APS系统中的一个重要组成部分 它
  • 电脑显示DNS服务器没检测到,连网时出现"该设备或资源(DNS 服务器)没有检测到有响应",怎么办?...

    连网时出现 该设备或资源 DNS 服务器 没有检测到有响应 怎么办 卡饭网 梦在深巷 2016 05 05 11 23 15 小编整理了以下2种解决方法大家可以参考以下 方法一 有可能是由于无线网络连接里面的DNS服务器错误 导致的网卡断网
  • 自动化遍历-appcrawler

    下载appclawler 下载地址 https pan baidu com s 1dE0JDCH list path 2F 查看帮助文档 java jar appcrawler 2 4 0 jar with dependencies jar
  • JS-ES6类

    使用js的class需注意以下几点 1 通过class关键字创建类 类名我们还是习惯性定义首字母大写 2 类里面有个constructor函数 可以接受传递过来的参数 同时返回实例对象 3 constructor 函数只要new生成实例时
  • seq2seq

    我的书 淘宝购买链接 当当购买链接 京东购买链接 seq2seq是通用编码器 解码器框架 encoder decoder framework 可以用在机器翻译 文本摘要 会话建模 图像描述 源码 https github com googl
  • 【编译原理】flex实现词法分析器

    flex自动实现词法分析器 FLEX 与 BISON 的使用 FLEX介绍 Flex是一个生成词法分析器的工具 它可以利用正则表达式来生成匹配相应字符串的C语言代码 其语法格式基本同Lex相同 单词的描述称为模式 Lexical Patte
  • 项目中好用的方法

    1 过滤 数组子项是对象的 对象有重复的 let arr res data filter function item index self return self findIndex el gt el applyPerson item ap
  • jsp 不能识别 el 表达式 的解决方法

    在以前使用EL表达式的时候 在JSP页面直接使用就可以了 但昨天我在做项目的时候在JSP页面上的EL表达式不能被识别 如 loginForm username 在页面上还是显示 loginForm username 后来我在JSP头上加上红
  • java面向对象----封装 && 构造器

    目录 封装和隐藏 为什么需要封装 信息的封装和隐藏 四种访问权限修饰符 构造器 构造方法 构造器的特征 语法格式 构造器重载 构造器重载举例 属性赋值过程 JavaBean UML类图 关键字 this this是什么 使用this 调用属
  • 抠图算法Background Matting:The world is your green screen

    论文地址 https arxiv org abs 2004 00626 代码 https github com senguptaumd Background Matting 背景介绍 抠图是照片编辑和视觉效果中使用的标准技术 在现有的抠图算
  • Python之浮点型

    python默认的是17位小数的精度 不支持32bit的单精度浮点数 如果程序需要精确控制区间和数字精度 可以考虑使用numpy扩展库 一 单精度和双精度的区别 内存不同 单精度浮点数占用4个字节 32位 存储空间 符号位1位 阶码8位 位
  • 【MySQL安装过程中显示ddl文件缺失】

    写在前面 每个人都遇到过 无法找到 dll文件 的消息弹窗 各位 这个问题终于可以解决了 在这里你可以找到电脑上最常丢失或损坏的文件 自由下载 无任何费用 1 问题描述 安装MySQL过程中遇到的问题 如图 这些是同一类问题 都是由于缺少
  • Go导入本地包

    举例来说项目文件结构如 C go mod go sum main go models User go 如果想要再main go中导入models包 那么首先需要在go mod中配置 则可以用 这种方式来导入models中的文件
  • 【读书笔记】周志华 机器学习 第五章 神经网络

    第五章 神经网络 1 神经元模型 2 感知机和多层网络 3 误差反向传播算法 4 局部极值点和鞍点 5 其他神经网络 6 参考文献 1 神经元模型 在生物神经网络中 一个神经元A与其他神经元相连 当它兴奋时 会向相连的神经元B发送化学物质改
  • CTFHUB-Refer注入

    Referer Referer 指当前请求的URL是在什么地址引用的 例如在www a com index html页面中点击一个指向www b com的超链接 那么 这个www b com的请求中的Referer就是www a com i
  • 区块链入门笔记(一)区块链概括

    区块链入门 李永乐老师的两个视频可以快速帮助入门区块链 1 比特币和区块链啥原理 矿机挖矿咋回事 2 比特币交易如何防伪 私钥公钥地址啥意思 比特币发展历史 在2008年之前 主要研究是比特币的基础例如数据加密 分布式系统等等 1 中本聪在
  • Valve.VR.SteamVR_AutoEnableVR_UnityPackage.Update () (at Assets/SteamVR/Editor/SteamVR_AutoEnableVR_

    unity 中导入 Steam Vr puls 报错 Valve VR SteamVR AutoEnableVR UnityPackage Update at Assets SteamVR Editor SteamVR AutoEnable
  • 适配ios13

    更新Xcode之后 新项目需求 新建项目发现多了如图1所示两个新的文件SceneDelegate h和SceneDelegate m 运行之后发现黑屏 无论是真机还是模拟器都不行 换到iOS12的手机上则可以正常运行 查看官方文档 Scen