Xcode11探索之旅

在更新到Xcode11、iOS13之后,对原有项目进行适配各种操作。
最近需求一个全新的APP,才发现Xcode11变了很多,再也不是我印象中的那个TA了。

  • Xcode11添加启动页
  • Xcode11创建启动页动画

背景:

  • Xcode11
  • iOS13.1
  • 纯代码构建

Xcode11设置启动页

首先感谢网上各位大神。

新建LaunchImage

拖入UI给的符合尺寸的图片

选择新建的启动页

Xcode11中,在target里边的App Icons and Launch Images,没有了Launch Images Source选项。

解决方法

Launch Screen File置为空。

在工程targets–>Build Settings 搜索 Asset Catalog Launch Image Set Name,然后设置成新建的启动图片名称即可。

警告⚠️

需要注意到一个警告:

从2020年4月开始,使⽤ iOS13 SDK 的 App 将必须提供 LaunchScreen,而LaunchImage将退出历史的舞台,说明以后启动页要通过LaunchScreen.storyboard来设置了。

从 iOS 8 的时候,苹果就引入了 LaunchScreen,我们可以设置 LaunchScreen来作为启动页。

使用LaunchImage的话,要求我们必须提供各种屏幕尺寸的启动图,来适配各种设备,随着苹果设备尺寸越来越多,这种方式显然不够 Flexible。

而使用 LaunchScreen的话,情况会变的很简单, LaunchScreen是支持AutoLayout+SizeClass的,所以适配各种屏幕都不在话下。

Xcode11纯代码创建启动动画/初始界面

删除工程中main.storyboard

  • 区别一:项目中除了有APPdelegate.h和APPdelegate.m文件,还有了Scenedelegate.h和Scenedelegate.m文件。

In iOS 13 and later, use UISceneDelegate objects to respond to life-cycle events in a scene-based app.
iOS13版本之后,AppDelegate(UIApplicationDelegate)控制生命周期的行为交给了SceneDelegate(UIWindowSceneDelegate)

这个场景,如果不使用iPad的多窗口不建议使用.

删掉info.plist文件中对应的键值

  • 区别二:info.plist文件中main.storyboard的引用位置发生了改变

因为iOS13之后出现了UISceneDelegate,main变为UISceneDelegate目录下,如下图。

删掉StoryboardName键值对。

如果只删除main.storyboard,会报如下的错误:

Could not find a storyboard named ‘Main’ in bundle NSBundle

删掉TARGETS中main的引用

方法一:使用UISceneDelegate

SceneDelegate.m中写入window初始化代码

警告⚠️

原来初始化window的代码如下:

1
2
3
4
5
6
7
//实例化window
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
//手写项目需要初始化开始页面:
ViewController *mainView = [[ViewController alloc] init];
self.window.rootViewController = mainView;
[self.window makeKeyAndVisible];

如果还用initWithFrame方法,运行项目,会出现启动页之后变成了黑屏。

正确的初始化方法是initWithWindowScene

1
2
3
4
5
6
7
8
UIWindowScene *windowScene = (UIWindowScene *)scene;
//实例化window
self.window = [[UIWindow alloc] initWithWindowScene:windowScene];
self.window.backgroundColor = [UIColor whiteColor];
//手写项目需要初始化开始页面:
ViewController *mainView = [[ViewController alloc] init];
self.window.rootViewController = mainView;
[self.window makeKeyAndVisible];

如下图所示

方法二:使用原有的AppDelegate(UIApplicationDelegate)

  • 删掉SceneDelegate.h和SceneDelegate.m文件

  • 删掉info.plist文件中关于UISceneDelegate的键值

  • 在APPdelegate.m中,注释掉关于UISceneDelegate的初始代码。

注释掉如下图所示代码:

  • 在AppDelegate.h中添加window属性

@property (strong, nonatomic) UIWindow * window;

之后的操作和改版之前一样。

-------------本文结束感谢您的阅读-------------

我的传送门:博客简书GitHub