UITraitCollection
的userInterfaceLevel
的documentation声明:
当您希望UI的某些部分从底层背景中脱颖而出时,请将UIUserInterfaceLevel.高架级别分配给它们。例如,系统将UIUserInterfaceLevel.提升级别分配给警报和弹出窗口。
你是怎么做到的如果尝试myOverlayView.traitCollection.userInterfaceLevel = .elevated
,则会出现错误“Cannot assign to property:'userInterfaceLevel'是只获取属性。”
我想知道是否有一个类似于overrideUserInterfaceStyle
的属性overrideUserInterfaceLevel
,但遗憾的是没有。🤔
1条答案
按热度按时间zbsbpyhn1#
iOS 17+
iOS 17引入了一个API,可以轻松覆盖任何trait集合值,包括用户界面级别。
myOverlayView.traitOverrides.userInterfaceLevel = .elevated
iOS 16-
无法在
UITraitCollection
上覆盖userInterfaceLevel
。不支持尝试重写UIView
子类中的traitCollection
变量。不幸的是,在UIView
上也没有一种方法可以像覆盖接口样式那样覆盖接口级别。有两个API可以覆盖视图控制器级别的trait集合,
UIView
子视图继承这些API:这一定是文档中所指的警报和弹出框是表示控制器。
如果您以一种看起来提升的方式呈现视图控制器,但系统不会自动提升它,则可以通过以下方式手动提升它:
如果您希望提升视图需要成为非提升视图控制器中的子视图,那么您似乎可以做的是为所需的提升视图创建视图控制器,将其添加为子视图,将其视图插入为子视图,然后覆盖子视图的trait集合。但这并不总是可能的,例如如果您正在使用输入附件视图,您希望被提升。
如果您无法实际提升视图,可以手动为视图(及其子视图)上色,就像它们被提升一样。为此,您可以解析特定trait集合的颜色,该集合应该是应用了提升的用户界面级别trait的视图trait集合。我创建了这个
UIColor
扩展:使用方法:
请注意,这将返回一个静态
UIColor
,它将不再动态响应颜色外观更改-例如,如果将用户界面样式从亮模式更改为暗模式,则颜色将不会自动更新。你需要用改变后的trait集合再次手动解析颜色,如下所示: