Objective-C - программно изменить цвет фона градиента UIViewController при изменении темного режима iOS 13

Я реализую функции для управления темным режимом iOS 13 в своем приложении. У меня проблема с фоном моего ViewController.

У моего контроллера представления есть цвет градиента фона, полученный с помощью CAGradientLayer.

Мне удалось изменить цвета, составляющие градиент, на основе выбора пользователя, когда он переходит из Темный режим ---> Светлый режим и Светлый режим ---> Темный режим ..

Моя проблема в том, что когда пользователь отправляет в фоновом режиме мое приложение, чтобы перейти в центр управления и изменить режим, цвета градиента, которые я использовал для цвета фона, не меняются сразу ...

Чтобы изменить цвет градиента, пользователь должен закрыть приложение и снова открыть его.

Очень плохой пользовательский опыт, поэтому я хотел спросить вас, как решить эту проблему ...

Это то, что я использую для изменения цвета моего градиента в зависимости от выбранного пользователем iOS режима.

- (void)viewDidLoad {
    [super viewDidLoad];

    [self setupBackground];
}

- (void)setupBackground {

    UIColor *secondaryColor = self.view.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark ? UIColor.customRedColor : UIColor.customGreenColor;

    CAGradientLayer *gradient = [CAGradientLayer layer];

    gradient.frame = UIApplication.sharedApplication.windows.firstObject.bounds;
    gradient.colors = @[(id)UIColor.customBlueColor.CGColor, (id)secondaryColor.CGColor];
    gradient.locations = @[@0.1, @0.9];

    [self.view.layer insertSublayer:gradient atIndex:0];
}

person kAiN    schedule 27.09.2019    source источник


Ответы (2)


Вы должны реализовать traitCollectionDidChange и обновить его фон:

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];

    if (@available(iOS 13.0, *)) { // Needed if your app supports iOS 12
        if ([self.traitCollection hasDifferentColorAppearanceComparedToTraitCollection:previousTraitCollection]) {
            [self setupBackground];
        }
    }
}

Конечно, это означает, что setupBackground будет вызываться много раз. Поэтому вам следует обновить его, чтобы он не добавлял каждый раз новый слой.

person rmaddy    schedule 27.09.2019
comment
Отлично, спасибо .. Я думал о другом решении .. Скажите, если я ошибаюсь .. Если я создам два фоновых изображения и вставлю их в актив (как для оправдания, так и для ясного), это не лучше ? Я бы избегал проблем с двойным вызовом правильных методов? - person kAiN; 28.09.2019
comment
Градиент лучше. С изображениями это становится беспорядочным, поскольку размер представления изменяется, например, при повороте устройства или поддержке режима разделения на iPad. - person rmaddy; 28.09.2019
comment
Я попытался реализовать предложенный вами метод, но когда я перехожу в фоновый режим, чтобы установить темный режим в настройках на моем устройстве, фон не меняется :( - person kAiN; 28.09.2019
comment
setupBackground называется? Нужны ли цвета? Вы уверены, что у вас есть только один слой в представлении? - person rmaddy; 28.09.2019
comment
Над контроллером представления (градиент применяется к его фону) у меня есть только еще одно представление 5, обозначение кнопки 1 и переключателя 1. Метод настройки [self setupBackground]; вызывается в представлении, загружено, чтобы указать градиент в первый раз, а затем вызывается в traitCollectionDidChange - person kAiN; 28.09.2019
comment
Вы не ответили на мои другие вопросы. Используйте отладчик и посмотрите, что происходит на самом деле. - person rmaddy; 28.09.2019
comment
Да, метод setupBackground вызывается каждый раз .. Цвета правильные, проблема в том, что он не меняется в соответствии с установленным режимом ... первый выбранный градиент всегда остается - person kAiN; 28.09.2019
comment
Убедитесь, что единственный слой градиента в представлении - это новый слой градиента с последними цветами. - person rmaddy; 28.09.2019

КАИН,

Есть много трудностей с реализацией темного режима с ObjC на iOS13, но, к счастью, группа разработчиков и дизайнеров нашла действительно простой способ сделать это:

https://medium.com/flawless-app-stories/implementing-dark-mode-on-ios-d195cac098de

С наилучшими пожеланиями. о /

person Breno Medeiros de Oliveira    schedule 27.01.2020