iOS 13 presentViewController 默认样式的变化

  • iOS13中,模态展示的视图默认样式变成iPhone上Safari展示的分页样式。
  • 解决方案
  • 其他iOS13适配方案

iOS 13 presentViewController 默认样式的变化

转发iOS 13[beta] presentViewController 默认样式的变化 + 问题解决方案

本文对应系统版本为 iOS 13

问题分析

在iOS 13之前,我们模态展示的视图默认是全屏的。但是更新到iOS13之后,默认的样式变成iPhone上Safari展示的分页样式。

在使用 presentViewController 来跳转视图时系统提供了两个参数来简化跳转的设置,modalTransitionStyle 和 modalPresentationStyle。前者为转场过渡的类型,后者为展示的样式,系统为两者都提供了多种可选样式。

在iOS13前,展示的方式 modalPresentationStyle 的值默认为0,即 .fullScreen。
而此时,在 iOS13 中变为了-2。

在 iOS13 中 modalPresentationStyle 的类型新增了以下类型:

UIModalPresentationAutomatic = -2

modalPresentationStyle的所有展示类型:

presentStyle

官方文档中能看到该参数的如下描述:

Use this value when you want to use the system’s recommended presentation style. For most view controllers, UIKit maps this style to the UIModalPresentationPageSheet style, but some system view controllers may map to a different style.

如果你想使用系统推荐的演示样式就使用此值,对于绝大部分视图控制器,UIKit将此值映射到UIModalPresentationPageSheet,但也有一些系统视图控制器会映射到不同样式

除了 “UISearchController” 和 “UIAlertController” 因为自身业务的特殊性不同外,其余的视图控制器均为 UIModalPresentationPageSheet 的展示样式。

另外,展现隐私政策的视图SFSafariViewController展示样式默认全屏,不用更改。

解决方案

在需要全屏展示的VC中添加代码:

1
2
3
4
5
6
7
8
- (instancetype)init
{
self = [super init];
if (self) {
self.modalPresentationStyle = UIModalPresentationFullScreen;
}
return self;
}

有问题欢迎评论。
简书

其他对于iOS13适配做的工作

APP 内全局关闭暗黑模式

解决方案

plist 里面添加如下键值:

1
2
<key>UIUserInterfaceStyle</key>
<string>UIUserInterfaceStyleLight</string>

UITextField通过KVC方式修改空白提示语颜色 崩溃

1
[UITextField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor”];

问题分析

私有API被封禁(KVC限制),禁止访问

解决方案

使用attributedPlaceholder

1
2
NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:placeStr attributes:@{NSForegroundColorAttributeName:[UIColor grayColor]}];
inputTextField.attributedPlaceholder = attString;

LaunchImage即将被废弃

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

当然,现在你还可以使用LaunchImage来设置启动图。

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

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

⚠️从2020年4月开始,所有使⽤ iOS13 SDK的 App将必须提供 LaunchScreen,LaunchImage即将退出历史舞台。可以使用LaunchScreen.storyboard来进行解决。

tabBarItem 选中状态的颜色无效,显示默认的蓝色

解决方案

以前只设置选中状态的颜色是可以的

1
[vc.tabBarItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: MENU_ITEM_SELECTED_COLOR, NSForegroundColorAttributeName, nil] forState:UIControlStateSelected

现在可以这样设置

1
2
3
4
5
6
if (@available(iOS 13.0, *)) {
self.tabBar.tintColor = MENU_ITEM_SELECTED_COLOR;

} else {
[vc.tabBarItem setTitleTextAttributes:@{NSForegroundColorAttributeName: MENU_ITEM_SELECTED_COLOR} forState:UIControlStateSelected];
}

参考文章

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

我的传送门:博客简书GitHub