iOS17适配指南之UITrait

UITrait与UITraitDefinition

  • iOS17 新增了一个协议UITraitDefinition,表示特征集合中特征的类型。通过遵守该协议可以实现自定义特征。
  • UITrait 则是UITraitDefinition.Type的别名。
swift 复制代码
@available(iOS 17.0, tvOS 17.0, *)
public protocol UITraitDefinition {
    associatedtype Value
    static var defaultValue: Self.Value { get }
    static var identifier: String { get }
    static var name: String { get }
    static var affectsColorAppearance: Bool { get }
}

@available(iOS 17.0, tvOS 17.0, *)
public typealias UITrait = UITraitDefinition.Type

UITraitCollection

  • UITraitCollection 包含的所有特征都遵守了UITraitDefinition协议。
  • 增加了新的构造方法。
  • 增加了修改方法。
swift 复制代码
// 创建
let customTraits = UITraitCollection { mutableTraits in
    mutableTraits.horizontalSizeClass = .compact
    mutableTraits.verticalSizeClass = .regular
    mutableTraits.userInterfaceStyle = .light
}

// 修改
let modifyTraits = customTraits.modifyingTraits { mutableTraits in
    mutableTraits.horizontalSizeClass = .regular
    mutableTraits.verticalSizeClass = .compact
    mutableTraits.userInterfaceStyle = .dark
}

traitCollectionDidChange()

UITraitEnvironment 协议中的traitCollectionDidChange()方法被废弃,监听特征改变需要使用UITraitChangeObservable协议中的相应的特征变化注册方法。

swift 复制代码
import UIKit

extension UIColor {
    static var viewBackgroundColor: UIColor {
        .init { (trait: UITraitCollection) -> UIColor in
            if trait.userInterfaceStyle == .dark {
                return .white
            }
            return .black
        }
    }

    static var viewControllerBackgroundColor: UIColor {
        .init { (trait: UITraitCollection) -> UIColor in
            if trait.userInterfaceStyle == .dark {
                return .red
            }
            return .green
        }
    }
}

class CustomView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)

        // iOS17之后
        registerForTraitChanges([UITraitUserInterfaceStyle.self], action: #selector(configureView))
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    // MARK: iOS17之前,被废弃
    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {}

    @objc private func configureView() {
        backgroundColor = .viewBackgroundColor
    }
}

class ViewController: UIViewController {
    lazy var customView: CustomView = {
        let customView = CustomView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
        customView.center = view.center
        customView.backgroundColor = .viewBackgroundColor
        return customView
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .viewControllerBackgroundColor
        view.addSubview(customView)
        // iOS17之后
        registerForTraitChanges([UITraitUserInterfaceStyle.self]) { (self: Self, previousTraitCollection: UITraitCollection) in
            self.view.backgroundColor = .viewControllerBackgroundColor
        }
    }

    // MARK: iOS17之前,被废弃
    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {}
}
相关推荐
承渊政道4 小时前
iOS远程控制电脑用什么好?iPhoneiPad远程控制Windows电脑最佳方案2026横评
windows·ios·远程控制·1024程序员节·iphone ipad
茶底世界之下4 小时前
彩色建筑适合转黑白吗?用 Awaking 检查颜色消失后的层次
ios
黑科技iOS上架5 小时前
App Store 26年10月新应用审核放缓大量应用不进审
ios·审核
OxYGC6 小时前
手机为什么能“自动跳过“开屏广告?李跳跳、GKD 与 iOS 代理软件原理盘点
android·ios·开屏广告·广告屏蔽
终端安全笔记17 小时前
一份配置管十项 AI 功能:它关的是入口,不是数据
网络安全·ios·移动设备管理
2501_915106321 天前
跨平台抓包工具怎么选?TraceEagle抓包鹰 的四种跨平台能力
网络协议·计算机网络·网络安全·ios·adb·https·udp
黑科技iOS上架1 天前
iOS应用上架:提前规避审核被拒风险
ios·审核
茶底世界之下1 天前
方图一定要裁照片吗?用 Awaking 比较裁切与留白
ios
00后程序员张1 天前
无需 Mac 的 iOS App 上架工具,开心上架Appuploader 负责哪些环节
android·ios·小程序·https·uni-app·iphone·webview
2501_915106321 天前
Windows 用 KXBuild 开发 iOS 项目,CocoaPods、SPM 怎么处理?
windows·vscode·ios·个人开发·swift·敏捷流程·cocoapods