ios 如何分配视图的UIUserInterfaceLevel?

6qqygrtg  于 2023-06-25  发布在  iOS
关注(0)|答案(1)|浏览(96)

UITraitCollectionuserInterfaceLeveldocumentation声明:
当您希望UI的某些部分从底层背景中脱颖而出时,请将UIUserInterfaceLevel.高架级别分配给它们。例如,系统将UIUserInterfaceLevel.提升级别分配给警报和弹出窗口。
你是怎么做到的如果尝试myOverlayView.traitCollection.userInterfaceLevel = .elevated,则会出现错误“Cannot assign to property:'userInterfaceLevel'是只获取属性。”
我想知道是否有一个类似于overrideUserInterfaceStyle的属性overrideUserInterfaceLevel,但遗憾的是没有。🤔

zbsbpyhn

zbsbpyhn1#

iOS 17+

iOS 17引入了一个API,可以轻松覆盖任何trait集合值,包括用户界面级别。
myOverlayView.traitOverrides.userInterfaceLevel = .elevated

iOS 16-

无法在UITraitCollection上覆盖userInterfaceLevel。不支持尝试重写UIView子类中的traitCollection变量。不幸的是,在UIView上也没有一种方法可以像覆盖接口样式那样覆盖接口级别。
有两个API可以覆盖视图控制器级别的trait集合,UIView子视图继承这些API:

这一定是文档中所指的警报和弹出框是表示控制器。
如果您以一种看起来提升的方式呈现视图控制器,但系统不会自动提升它,则可以通过以下方式手动提升它:

let myViewController = MyViewController()
myViewController.modalPresentationStyle = .overFullScreen
myViewController.modalTransitionStyle = .crossDissolve
myViewController.presentationController?.overrideTraitCollection = UITraitCollection(userInterfaceLevel: .elevated)
present(myViewController, animated: true, completion: nil)

如果您希望提升视图需要成为非提升视图控制器中的子视图,那么您似乎可以做的是为所需的提升视图创建视图控制器,将其添加为子视图,将其视图插入为子视图,然后覆盖子视图的trait集合。但这并不总是可能的,例如如果您正在使用输入附件视图,您希望被提升。
如果您无法实际提升视图,可以手动为视图(及其子视图)上色,就像它们被提升一样。为此,您可以解析特定trait集合的颜色,该集合应该是应用了提升的用户界面级别trait的视图trait集合。我创建了这个UIColor扩展:

extension UIColor {
    func elevated(for view: UIView) -> UIColor {
        let elevatedTraitCollection = UITraitCollection(userInterfaceLevel: .elevated)
        return resolvedColor(with: UITraitCollection(traitsFrom: [view.traitCollection, elevatedTraitCollection]))
    }
}

使用方法:

overlayView.backgroundColor = .systemBackground.elevated(for: overlayView)

请注意,这将返回一个静态UIColor,它将不再动态响应颜色外观更改-例如,如果将用户界面样式从亮模式更改为暗模式,则颜色将不会自动更新。你需要用改变后的trait集合再次手动解析颜色,如下所示:

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    
    if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
        //update colors
    }
}

相关问题