我一直在处理采用新的iOS 13动态颜色的任务,我得到了一个使用CGContextSaveGState
,CGContextSetStrokeColorWithColor
,CGContextAddPath
等在屏幕上绘制形状的实现。我认为因为CGContextSetStrokeColorWithColor要求我通过UIColor
的CGColor
,此时我传递的颜色的"动态"性质[UIColor labelColor]
基本上被打破了,不再是动态的。
有没有人知道如何处理我使用CGContextSetStrokeColorWithColor
绘制但又想利用并添加对新 iOS 13 动态颜色的支持的情况?
事实证明这相当容易。
我拥有的是UIView
,其中我持有使用CGContextSetStrokeColorWithColor
的CALayer
实例的NSMutableArray
,我传递动态颜色,但将其CGColor
传递给CGContextSetStrokeColorWithColor
。然后,我使用该layoutSublayersOfLayer
设置这些CALayer
实例的.frame
。在这种情况下,为了更新我将其传递给的那些CALayer
实例的颜色,我必须覆盖我的UIView
的 traitCollectionDidChange 并调用setNeedsDisplay
- (void) traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
{
if (@available(iOS 12.0, *)) {
if (previousTraitCollection.userInterfaceStyle != UIUserInterfaceStyleUnspecified
&& self.traitCollection.userInterfaceStyle != previousTraitCollection.userInterfaceStyle) {
for (CALayer *caLayer in _myCsLayers) {
[caLayer setNeedsDisplay];
}
}
}
}