CGContextSetStrokeColorWithColor
是 Core Graphics 框架中的一个函数,用于设置图形上下文的描边颜色。在 iOS 开发中,动态颜色(Dynamic Colors)是一种可以在不同外观模式(如浅色模式和深色模式)下自动调整颜色的特性。
UIColor.systemBlue
,会根据系统设置自动调整。UIColor
的初始化方法创建,结合 UIColorAsset
管理。应用场景包括但不限于:
在 iOS 13 及更高版本中,如果使用了动态颜色但在深色模式切换后 UI 没有自动刷新,可能的原因包括:
在深色模式切换时,可以手动调用视图的 setNeedsLayout
和 layoutIfNeeded
方法来强制刷新布局。
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
self.view.setNeedsLayout()
self.view.layoutIfNeeded()
}
}
UIColorAsset
确保使用 UIColorAsset
来管理动态颜色,这样可以确保颜色在不同模式下正确切换。
let dynamicColor = UIColor(named: "MyDynamicColor")!
myView.strokeColor = dynamicColor
通过 UITraitCollectionDidChange
代理方法监听系统外观的变化,并作出相应的更新。
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
updateUIForCurrentTraitCollection()
}
private func updateUIForCurrentTraitCollection() {
// 更新颜色和其他UI元素
}
以下是一个完整的示例,展示了如何在深色模式切换时更新 UI:
class MyViewController: UIViewController {
@IBOutlet weak var myView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
updateUIForCurrentTraitCollection()
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
updateUIForCurrentTraitCollection()
}
}
private func updateUIForCurrentTraitCollection() {
let dynamicColor = UIColor(named: "MyDynamicColor")!
myView.strokeColor = dynamicColor
myView.setNeedsLayout()
myView.layoutIfNeeded()
}
}
通过上述方法,可以确保在使用 CGContextSetStrokeColorWithColor
和动态颜色时,UI 能够在深色模式切换后正确地自动刷新。
领取专属 10元无门槛券
手把手带您无忧上云