Только светлый цвет внешнего вида возвращается из [UIColor colorNamed:], хотя traitCollection.userInterfaceStyle = Dark - PullRequest
0 голосов
/ 06 ноября 2019

Я работаю над добавлением поддержки iOS 13 Dark Mode в мое приложение iOS 11+. Прекрасно работает с использованием именованных / динамических цветов во всем приложении.

Однако при использовании [UIColor colorNamed:] в пользовательском классе всегда возвращается версия светлого цвета (#ffffff / white) вместо версии темного цвета (#000000 / black):

// Some ViewController
CustomClass *custom = [customClass alloc] initWithTraitCollection:self.traitCollection]; 

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    custom.traitCollection = self.traitCollection;
}


// CustomClass
- (void)initWithTraitCollection:(UITraitCollection *)traitCollection {
    self = [super init];
    if (self) {
        self.traitCollection = traitCollection;
    }
    return self;
}

- (void)doSomething {    
    NSLog(@"CustomClass UIStyle: %@", (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark ? @"dark" : (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleLight ? @"light" : @"unspecified")));

    // Trying to get the color in three different ways (normal + specify traitCollection explicitly)
    UIColor *color1 = [UIColor colorNamed:@"whiteOrBlack"];
    UIColor *color2 = [UIColor colorNamed:@"whiteOrBlack" inBundle:nil compatibleWithTraitCollection:self.traitCollection];

    __block UIColor *color3 = color1;
    [self.traitCollection performAsCurrentTraitCollection:^{
         color3 = [UIColor colorNamed:@"whiteOrBlack"];
    }];

    // Output
    NSLog(@"   color1: %@", [self colorAsHexString:color1]);
    NSLog(@"   color2: %@", [self colorAsHexString:color2]);
    NSLog(@"   color3: %@", [self colorAsHexString:color3]);
}


// Output
CustomClass UIStyle: dark
   #ffffff
   #ffffff
   #ffffff

Неважно, если я явно укажу traitCollection / UIUserInterfaceStyle или нет. Возвращается только светлый цвет, даже если UIUserInterfaceStyleDark активен.

Я что-то упустил?

Есть ли какой-либо другой способ, так явно укажите, какойзначение цвета, к которому я хотел бы получить доступ?

1 Ответ

1 голос
/ 08 ноября 2019

UIColor, который вы выбираете из каталога активов, - динамический . Это означает, что значения его компонентов RGB зависят от значения [UITraitCollection currentTraitCollection]. Каждый раз, когда вы запрашиваете компоненты, цвет разрешается сам на основе currentTraitCollection.

. Вы не показывали реализацию метода -colorAsHexString:, но он должен получать компоненты RGB из цвета. каким-то образом.

Следовательно, вы хотите вызвать -colorAsHexString: в то время, когда вы установили currentTraitCollection, например:

    UIColor *dynamicColor = [UIColor colorNamed:@"whiteOrBlack"];

    [self.traitCollection performAsCurrentTraitCollection:^{
         NSLog(@"Color: %@", [self colorAsHexString:dynamicColor]);
    }];

(Еще лучше, вы могли бы поставитьвызов performAsCurrentTraitCollection внутри реализации -colorAsHexString:, если это имеет смысл в вашем конкретном случае.)

Вот как получить разрешенный, не динамический цвет для определенной коллекции признаков:

    UIColor *dynamicColor = [UIColor colorNamed:@"whiteOrBlack"];
    UIColor *resolvedColor = [dynamicColor resolvedColorWithTraitCollection:self.traitCollection];
...