iOS 5: интересует UIAppearance - PullRequest
       40

iOS 5: интересует UIAppearance

50 голосов
/ 24 ноября 2011

На tech talk 2011 я увидел речь о новом протоколе UIAppearance .Там еще не так много документации.Я кратко изложу то, что помню, чтобы объяснить, откуда приходит мой вопрос:


О UIAppearance:

Пока вам приходилось настраивать КАЖДУЮ навигациюсвойство bar (панель инструментов и т. д.) во всех контроллерах представления вашего приложения.С новым свойством внешнего вида вы можете сделать это только в одном месте для всех панелей навигации в вашем приложении.Например: если вы хотите настроить фоновое изображение панели навигации, вы можете сделать это следующим образом:

[[UINavigationBar appearance] setBackgroundImage:
   [UIImage imageNamed:@"MyImageName"] forBarMetrics:UIBarMetricsDefault]; 

Это установит фоновое изображение ВСЕХ панелей навигации в вашем приложении.С помощью barMetrics вы указываете, хотите ли вы, чтобы изображение использовалось также в альбомном режиме или нет.

Если вы хотите указать внешний вид, который будет применяться только в некоторых контроллерах представления, в методе также есть методДокументы для контроля, указав, где находятся ваши объекты:

[[UIBarButtonItem appearanceWhenContainedIn:
    [ABPeoplePickerNavigationController class], nil] setTintColor:myNavBarColor];

Также стоит отметить, что если у вас есть отдельные настраиваемые экземпляры, отличающиеся от ваших настроек внешнего вида, эти экземпляры не будут зависеть от прокси внешнего вида.,


Некоторые вопросы:

a) Как узнать, какие свойства класса работают со свойством внешнего вида? Например, так какUITableView соответствует протоколу UIAppearance. Я думал, что мог бы сделать что-то вроде

[[UITableView appearance] setBackgroundColor:mytableViewColor];

, чтобы манипулировать цветом фона всех моих табличных представлений, но я не могу!

б) Есть ли список всех классов, которыми можно манипулировать со свойством внешнего вида?

в) В какой момент вызывается настройка внешнего вида? Я надеялся внести изменения, вызвавшие появление свойства свойства во время выполнения, но, к сожалению, изменения не происходят.

Ответы [ 3 ]

37 голосов
/ 25 ноября 2011

а) Как узнать, какие экземпляры класса работают со свойством внешнего вида?Например, поскольку UITableView соответствует протоколу UIAppearance, я подумал, что мог бы сделать что-то вроде

Вы смотрите в заголовке класса (и заголовках всех суперклассов).Любой метод с UI_APPEARANCE_SELECTOR рядом с ним поддерживается для использования с прокси UIAppearance.

[[UITableView appearance] setBackgroundColor:mytableViewColor];

Свойство backgroundColor не украшено UI_APPEARANCE_SELECTOR в UIView.h.Таким образом, он технически не поддерживается для использования с прокси внешнего вида. вероятно будет работать, но (учитывая отсутствие декорации метода) не гарантируется.

От UIAppearance Protocol Reference:

Для поддержки внешнего видаПри настройке класс должен соответствовать протоколу UIAppearanceContainer, а соответствующие методы доступа должны быть помечены UI_APPEARANCE_SELECTOR.

(примечание " и соответствующие методы доступа должны быть отмеченным ... "[выделение добавлено])


b) Есть ли список всех свойств, которые можно манипулировать с помощью свойства Appearance?

Есть ли на одной странице каждый сеттер, работающий с прокси внешнего вида?Я не знаю ни одного, и нет способа построить список во время выполнения.


c) В какой момент вызывается настройка внешнего вида?Я надеялся внести изменения в свойство throw во время выполнения, но, к сожалению, эти изменения не происходят.

Вы можете использовать прокси-сервер отображения в любой момент во время выполнения.Изменения не будут применены к затронутым представлениям, пока в следующий раз для этих представлений не будет вызван их метод -layoutSubviews.

4 голосов
/ 24 ноября 2011

UIAppearance документируется в заголовках каждого класса.Найдите там методы, помеченные UI_APPEARANCE_SELECTOR в самом конце.Это те методы, которые вы можете вызывать через внешний прокси.Я не знаю о списке за пределами заголовков.

Настройка внешнего вида вызывается сразу после прохождения через прокси, а также всякий раз, когда создается новый объект.Но это будет работать только для методов, отмеченных этим UI_APPEARANCE_SELECTOR

2 голосов
/ 24 ноября 2011

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 определяет эти методы:

@ свойство (неатомное, сохранение) UIColor * tintColor UI_APPEARANCE_SELECTOR;

Из Справочник по протоколу UIAppearanceContainer

И в Ссылка на класс UIBarButtonItem tintColor определяется

@ свойство (неатомное, сохранение) UIColor * tintColor

Но в UIBarButtonItem.h определено:

@property(nonatomic,retain) UIColor *tintColor __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0) UI_APPEARANCE_SELECTOR;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...