UIKit中有一些类我们不常用,但是需要我们去了解的,这里做一个总结!
1. UIWindowScene @available(iOS 13.0, *)
iOS13系统新出的多场景窗口功能(多个场景窗口仅iPad应用可以配置,iPhone应用只能一个窗口),UIWindowScene
是一个代表一个场景的类,继承自UIScene
。我们在开发中如果是iPhone应用并且是开发iOS13以上的APP,那么可以使用SceneDelegate
的那一套,否则建议删掉SceneDelegate
的那一套。
关于多场景窗口功能具体可以查看iOS使用SceneDelegate
2.UITraitCollection @available(iOS 8.0, *)
系统的设置特征修改会放在UITraitCollection
这个类中,我们在iOS13暗黑模式适配时经常会用到这个类。
类的属性:
// 描述设备类型的枚举phone、pad、tv、carplay、mac
open var userInterfaceIdiom: UIUserInterfaceIdiom { get }
// 描述当前是dark、light模式
open var userInterfaceStyle: UIUserInterfaceStyle { get }@available(iOS 12.0, *)
// @1x, @2x, @3x的屏幕像素比
open var displayScale: CGFloat { get }
// 横向、纵向大小,UIUserInterfaceSizeClass有compact紧凑、regular常规两个值
open var horizontalSizeClass: UIUserInterfaceSizeClass { get }
open var verticalSizeClass: UIUserInterfaceSizeClass { get }
// 支持的色彩色域:SRGB或者P3
open var displayGamut: UIDisplayGamut { get }
// 设置的文本权重
@available(iOS 13.0, *)
open var legibilityWeight: UILegibilityWeight { get }
如何获取这个对象?
我们UIKIt中的UIScreen、UIWindow、UIViewController、UIView都是遵守UITraitEnvironment
协议的,遵守了这个协议的对象都拥有属性traitCollection
系统设置发生变化了,对应的方法会被调用:
@available(iOS 8.0, *)
func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)
我们适配iOS 13系统的暗黑模式就会用到这个类
3. NSUserActivity@available(iOS 8.0, *)
NSUserActivity对象提供了一种轻量级的方法来捕获应用程序的状态并在以后使用。您可以创建用户活动对象,并使用它们捕获有关用户正在执行的操作的信息,例如查看应用程序内容、编辑文档、查看网页或观看视频。当系统启动您的应用程序并且活动对象可用时,您的应用程序可以使用该对象中的信息将自身还原到适当的状态。Spotlight还使用用户活动对象来改进用户的搜索结果。
它处理的事情有:
Universal Links
: Universal links 是可以在关联应用或者 Safari 中打开的 URL。SiriKit
: Siri 可以调起你的应用并且告知你它想要做什么。Spotlight
: 定义你的应用可以做的动作,这些动作会被引入 Spotlight 的搜索结果中。Handoff
: 即“接力”,指一个应用可以继续另一个应用的工作,或者一台设备上的相同应用可以继续另一个设备上的应用的工作。
详细的使用方式见在 SwiftUI 中使用 NSUserActivity
4. UIImageAsset @available(iOS 8.0, *)
这个类比较简单,主要关注3个方法:
open func image(with configuration: UIImage.Configuration) -> UIImage
open func register(_ image: UIImage, with configuration: UIImage.Configuration)
open func unregisterImage(with configuration: UIImage.Configuration)
应用举例:比如我们适配暗黑模式,某个控件要在暗黑和明亮模式下显示不同图片,这个时候我们一是可以在image.asset里面手动配置; 二是,如果我们是网络加载的,这种情况如果还希望实现这个自动切换,那就需要自己使用UIImageAsset来做:
let dark = UIImage(named: "frowney.png")
let light = UIImage(named: "smiley.png")
let asset : UIImageAsset = UIImageAsset.init()
var darkTrait : UITraitCollection?
var lightTrait : UITraitCollection?
if #available(iOS 12.0, *) {
darkTrait = UITraitCollection(userInterfaceStyle: .dark)
lightTrait = UITraitCollection(userInterfaceStyle: .light)
asset.register(dark!, with: darkTrait!)
asset.register(light!, with: lightTrait!)
}
imgV.image = light
上述代码实现后的效果是,在光亮模式下显示的smiley.png
, 在暗黑模式下显示的是frowney.png
网友评论