Цель C - программно изменить цвет градиента фона UIViewController, когда темный режим iOS 13 изменился - PullRequest
0 голосов
/ 28 сентября 2019

Привет всем! В моем приложении реализованы функции управления Темным режимом 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];
}

1 Ответ

1 голос
/ 28 сентября 2019

Вы должны реализовать 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 будет вызываться много раз.Поэтому вы должны обновить его, чтобы он не добавлял новый слой каждый раз.

...