IOS 5: Интересно о UIAppearance
В Tech Talk 2011 я увидел речь о новом UIAppearance
protocol. Там еще не так много документации. Вкратце я кратко изложу, что я помню, чтобы объяснить, откуда мой вопрос:
О UIAppearance
:
До сих пор вам приходилось настраивать свойство КАЖДОЙ панели навигации (панель инструментов и т.д.) во всех ваших диспетчерах представления приложений. С новым свойством внешнего вида вы можете сделать это только в одном месте для всех навигационных панелей в своем приложении. Например: если вы хотите настроить фоновое изображение на панели навигации, вы можете сделать это следующим образом:
[[UINavigationBar appearance] setBackgroundImage:
[UIImage imageNamed:@"MyImageName"] forBarMetrics:UIBarMetricsDefault];
Это установит фоновое изображение всех навигационных панелей в вашем приложении. С помощью barMetrics
вы указываете, хотите ли вы использовать изображение в ландшафтном режиме или нет.
Если вы хотите указать внешний вид, который будет применяться только в некоторых контроллерах представлений, в документах также есть метод для управления этим, указав, где находятся ваши объекты:
[[UIBarButtonItem appearanceWhenContainedIn:
[ABPeoplePickerNavigationController class], nil] setTintColor:myNavBarColor];
Также стоит упомянуть, что если у вас есть отдельные настроенные экземпляры, отличные от ваших настроек внешнего вида, экземпляры тезисов не будут выполняться прокси-сервером внешнего вида.
Некоторые вопросы:
a) Как узнать, какие свойства класса работают с свойством внешнего вида?. поскольку UITableView
соответствует протоколу UIAppearance, я думал, что могу сделать что-то вроде
[[UITableView appearance] setBackgroundColor:mytableViewColor];
чтобы управлять цветом фона всех моих табличных представлений, но я не могу!
b) Есть ли список всех классов, которые манипулируют с свойством внешнего вида?
c) В какой момент вызывается оформление внешнего вида? Я надеялся, что изменения внесут свойство отображения во время выполнения, но, к сожалению, изменения не происходят.
Ответы
Ответ 1
a) Как узнать, какие экземпляры класса работают с свойством внешнего вида? Напр. поскольку UITableView соответствует протоколу UIAppearance, я думал, что могу сделать что-то вроде
Вы смотрите в заголовок класса (и заголовки всех суперклассов). Любой метод, который имеет UI_APPEARANCE_SELECTOR
рядом с ним, поддерживается для использования с прокси-сервером UIAppearance
.
[[UITableView appearance] setBackgroundColor:mytableViewColor];
Свойство backgroundColor
не украшено UI_APPEARANCE_SELECTOR
в UIView.h
. Таким образом, он не поддерживается технически для использования с внешним прокси. Это, вероятно, будет работать, но (учитывая отсутствие украшения метода) не гарантируется.
Из UIAppearance Protocol Reference
:
Для поддержки настройки внешнего вида класс должен соответствовать протоколу UIAppearanceContainer
, а соответствующие методы доступа должны быть отмечены UI_APPEARANCE_SELECTOR
.
(обратите внимание на и соответствующие методы доступа должны... "[выделено мной]
b) Есть ли список всех свойств, которые можно манипулировать с свойством внешнего вида?
Есть ли одна страница, показывающая каждый сеттер, который работает с прокси-сервером внешнего вида? Я не знаю ни одного, и нет способа создать список во время выполнения.
c) В какой момент вызывается визуализация внешнего вида? Я надеялся, что изменения внесут свойство отображения во время выполнения, но, к сожалению, изменений не происходит.
Вы можете использовать прокси-сервер внешнего вида в любой момент во время выполнения. Изменения не будут применены к затронутым представлениям до тех пор, пока в следующий раз эти виды не будут вызваны методом -layoutSubviews
.
Ответ 2
UIAppearance
документируется в заголовках каждого класса. Посмотрите там, где есть методы, отмеченные UI_APPEARANCE_SELECTOR
в самом конце. Таковы методы, которые вы можете вызвать через прокси-сервер внешнего вида. Я не знаю список за пределами заголовков.
Настройка внешнего вида вызывается сразу после прокси-сервера, а также всякий раз, когда создается новый объект. Но это будет работать только для методов, отмеченных этим UI_APPEARANCE_SELECTOR
Ответ 3
a: Следующая строка
[[UITableView appearance] setBackgroundColor:[UIColor blueColor]];
Будет выглядеть каждый стол в синем! Просто протестирован на симуляторе iOS 5.
b: UIAppearance должен работать над каждым свойством на UIView
. Все подклассы UIView
соответствуют UIAppearance Protocol
c: Я думаю, что большинство из них создадут класс и метод, которые будут настраивать внешний вид и будут называть его:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Что-то вроде: [ApplicationAppearance setApplicationSchemaTo:ASchemaBlue];
Edit:
Например, UIBarButtonItem определяет следующие методы:
@property (неатомный, сохраняемый) UIColor * tintColor UI_APPEARANCE_SELECTOR;
Из Ссылка на протокол UIAppearanceContainer
И в Справочнике классов UIBarButtonItem определяется tintColor
@property (неатомный, сохраняемый) UIColor * tintColor
Но в UIBarButtonItem.h определено:
@property(nonatomic,retain) UIColor *tintColor __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0) UI_APPEARANCE_SELECTOR;
Я думаю, что документы не обновлены.