Использование UIAppearance и переключение тем

Я ищу тему для своего приложения для iOS и читаю UIAppearance. Я хочу, чтобы пользователь мог переключаться между различными визуальными темами из приложения. Затем изменение темы будет отображаться в пользовательском интерфейсе.

Я думаю, что у меня мог бы быть файл темы, который является синглтоном, загруженным в appDelegate.m. Но после этого я немного застрял в том, как это можно реализовать?


person JMWhittaker    schedule 12.06.2013    source источник
comment
Вас может заинтересовать UISS: github.com/robertwijas/UISS   -  person Patrick Tescher    schedule 12.06.2013
comment
Не видел UISS до этого, похоже, он тоже решает перезагрузку при смене темы. Спасибо!   -  person JMWhittaker    schedule 13.06.2013


Ответы (4)


UIKit устанавливает свойства из прокси-сервера UIAppearance после добавления представления в иерархию представлений.

В UISS я использую такой метод:

- (void)reloadAppearance {
    NSArray * windows = [UIApplication sharedApplication].windows;

    for (UIWindow *window in windows) {
        for (UIView *view in window.subviews) {
            [view removeFromSuperview];
            [window addSubview:view];
        }
    }
}

Другой трюк — удалить rootViewController из главного окна и снова добавить его. Хотя я предпочитаю первое решение, потому что оно охватывает более широкий круг случаев.

person Robert Wijas    schedule 13.06.2013
comment
Я начал использовать UISS и пока мне это нравится. Как бы вы поменялись темами? Просто перезагрузить другой файл темы? - person JMWhittaker; 16.06.2013
comment
В настоящее время UISS официально не поддерживает темы. Однако вы можете заставить его работать, изменив UISS.style.url и вызвав reloadStyleAsynchronously для экземпляра UISS. - person Robert Wijas; 23.06.2013
comment
Почему-то в iOS9 оба предложения у меня не сработали - person Mohamed Saleh; 22.11.2015

Это работает для меня в Swift:

let windows = UIApplication.sharedApplication().windows
for window in windows {
    for view in window.subviews {
        view.removeFromSuperview()
        window.addSubview(view)
    }
}
person Daniel Tovesson    schedule 30.06.2016

Решение, предложенное Робертом, мне не подходит. Я использую iOS9 и UITabbarController. Это единственное предложение, которое сработало из ответа здесь

В основном это хорошо объяснило проблему, когда мы используем UIAppearance, он в основном применяется и не будет меняться до тех пор, пока представления не будут перерисованы снова, чего не произойдет, особенно с rootViewController, таким как UITabbarControllers, и новые цвета будут иметь эффект ТОЛЬКО ПОСЛЕ того, как приложение будет удалено из памяти и снова открыть, если вы хотите немедленное изменение, вам придется сделать это вручную и установить каждое свойство, как описано в ответе в прикрепленной ссылке

person Mohamed Saleh    schedule 22.11.2015

Свифт 4:

let windows = UIApplication.shared.windows
for window in windows {
    for view in window.subviews {
        view.removeFromSuperview()
        window.addSubview(view)
    }
}
person ironRoei    schedule 22.04.2018