iOS 5: Интересно о UIAppearance

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


О UIAppearance :

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

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

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

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

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

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


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

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

 [[UITableView appearance] setBackgroundColor:mytableViewColor]; 

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

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

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

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

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

 [[UITableView appearance] setBackgroundColor:mytableViewColor]; 

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

Из UIAppearance Protocol Reference :

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

(обратите внимание: « и соответствующие методы доступа должны быть отмечены …» [выделено мной]


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

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


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

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

UIAppearance документируется в заголовках каждого classа. Посмотрите там, где методы, обозначенные как UI_APPEARANCE_SELECTOR в самом конце. Таковы методы, которые вы можете вызвать через прокси-сервер внешнего вида. Я не знаю список за пределами заголовков.

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

a: Следующая строка

  [[UITableView appearance] setBackgroundColor:[UIColor blueColor]]; 

Будет делать каждый вид стола синим! Просто протестирован на симуляторе iOS 5.

b: UIAppearance должен работать над каждым свойством UIView . Все подclassы UIView соответствуют UIAppearance Protocol

c: Я думаю, что большинство из них создадут class и метод, которые будут настраивать внешний вид и будут называть его:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

Что-то вроде: [ApplicationAppearance setApplicationSchemaTo:ASchemaBlue];

Редактировать:

Например, UIBarButtonItem определяет следующие методы:

@property (неатомный, сохраняемый) UIColor * tintColor UI_APPEARANCE_SELECTOR;

Из протокола UIAppearanceContainer Protocol

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

@property (неатомный, сохраняемый) UIColor * tintColor

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

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

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

  • Предупреждать, когда не вызывается
  • Ошибка сборки Xcode «Неопределенные символы для архитектуры x86_64»
  • applicationWillEnterForeground против applicationDidBecomeActive, applicationWillResignActive vs. applicationDidEnterBackground
  • Сохранение изображения в plist
  • Как анализировать длительность ISO-8601 в Objective C?
  • Как создать изображение из UILabel?
  • objective C: Как вы можете повернуть текст для UIButton и UILabel?
  • Прокрутка UITableView внутри UIScrollView
  • Что мне нужно сделать, чтобы заставить Core Data автоматически переносить модели?
  • UIPopoverController для iphone не работает?
  • Статическая строковая переменная в Objective C на iphone
  • Interesting Posts

    Запуск запланированной задачи путем обнаружения соединения USB-устройства

    Почему Java ограничивает размер метода до 65535 байт?

    double или float, что быстрее?

    Никогда не заканчивается ответ сервера чтения с помощью jSch

    Есть ли способ включить запятые в столбцы CSV, не нарушая форматирование?

    Где бы вы разместили свой файл базы данных SQLite в приложении для iPhone?

    Java, Как добавить файлы библиотеки в netbeans?

    Как распечатать С помощью XDocument

    Тестирование модуля ASP.Net MVC Авторизовать атрибут для проверки перенаправления на страницу входа в систему

    Извлеките большой ZIP-файл (50 ГБ) на Mac OS X

    Как преобразовать изображение растрового изображения низкого качества в вектор?

    Нужно ли мне активировать Windows 8, если я использовал его раньше?

    Извлечь числовую часть строк смешанных чисел и символов в R

    Каков наилучший способ поймать исключение в Задаче?

    Что заставляет JNI звонить медленно?

    Давайте будем гением компьютера.