`CGContextSetStrokeColorWithColor` с iOS 13 динамическими цветами, без автоматического обновления пользовательского интерфейса после переключения темного режима - PullRequest
0 голосов
/ 16 октября 2019

Я решил принять новые динамические цвета iOS 13 и получил реализацию, которая использует CGContextSaveGState, CGContextSetStrokeColorWithColor, CGContextAddPath и т. Д. Для рисования фигуры на экране. Я думаю, что, поскольку CGContextSetStrokeColorWithColor требует, чтобы я пропустил CGColor из UIColor, в этот момент «динамический» характер передаваемого мною цвета, который [UIColor labelColor], в основном нарушается и уже не является динамическим.

Кто-нибудь знает, как обращаться с такими сценариями, когда я использую CGContextSetStrokeColorWithColor для рисования, но также хочет воспользоваться и добавить поддержку новых динамических цветов iOS 13?

1 Ответ

0 голосов
/ 16 октября 2019

Это оказалось довольно просто.

У меня был UIView, в котором я держу NSMutableArray из CALayer экземпляров, которые используют CGContextSetStrokeColorWithColor, и я передаю динамический цвет, нопередать его CGColor на CGContextSetStrokeColorWithColor. Затем я использую layoutSublayersOfLayer, чтобы установить .frame этих CALayer экземпляров. В этом сценарии, чтобы обновить цвета тех CALayer экземпляров, в которых я его передал, мне пришлось переопределить traitCollectionDidChange моего UIView и вызвать 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];
            }
        }
    }
}
...