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;

Я думаю, что документы не обновлены.