IOS7 UILabel принять тот же цвет tintColor, что и окно

Я знаю, что для элементов классов UIButton и UIBarButtonItem они автоматически принимают window.tintColor в качестве основного цвета, что приводит к немедленному изменению в случае, когда я устанавливаю новый tintColor для окна в любое время в приложении.

Мне было интересно, есть ли способ сделать элементы UILabel для того, чтобы следовать одному и тому же шаблону, где после создания они автоматически принимают свой цвет по умолчанию как window.tintColor, и если изменение window.tintColor в любое время в моей среде выполнения приложения будет также приводит к автоматическому изменению tintColour UILabel?

Надеюсь, это имеет смысл.

Ответ 1

UILabels являются подклассом UIView, поэтому, когда вы работаете в iOS 7, они будут иметь свойство tintColor и наследуют этот цвет от своего родительского представления, если их цвет оттенка установлен на nil ( который по умолчанию).

От Документация Apple:

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

Однако вы также спрашиваете: "Если изменение window.tintColor в любое время в моей среде выполнения приложения также приведет к автоматическому изменению tintColour UILabel?" Apple советует не изменять цвет оттенка, когда элементы находятся на экране:

В общем, лучше всего изменить цвет оттенков вида, пока представление за кадром.

Я бы предположил, что это связано с тем, что нет никакой гарантии, что все различные элементы пользовательского интерфейса обнаружат изменение tintColor и обновят их видимые виды. Тем не менее, UIView документация предлагает обходной путь, если вы хотите обновить tintColor, пока ваш UILables находится на экране:

Чтобы обновить рендеринг subview при изменении этого свойства, переопределите метод tintColorDidChange.

Поэтому просто позвоните tintColorDidChange в любое время, отображаемое на экране, цвет оттенка которого должен обновляться при изменении tintColor их родительского представления.

Но почему ваш UILabel не обновляет цвет?

Итак, приведенное выше поможет вам установить и обновить различные tintColor, но вы не видите никакого эффекта - почему?

Хорошо, что связано с тем, что Apple спроектировал Tint. Из Руководства по человеческому интерфейсу:

Цвет

дает пользователям сильный визуальный индикатор интерактивности

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

UILabel не является интерактивным элементом - это текстовое описание - и поэтому Apple позволит вам установить на нем tintColor (поскольку любой UIView имеет tintColor), но установка tintColor будет не изменяйте, как это делается.

Итак, что вы должны делать?. Во-первых, имейте в виду, что создание более чем простых кнопок при использовании цвета оттенков может быть низким выбором пользовательского интерфейса для вашего приложения. Пользователи iOS 7 и рецензенты Apple app ожидайте соблюдения этих правил.

Итак, вы вынуждены оставить ваш UILabel свободным от цвета?

Нет - особенно если вы делаете "правильно". Apple объясняет:

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

Я бы предложил вам рассмотреть пользовательский интерфейс вашего приложения. Если вы действительно хотите, чтобы ваши неинтересные элементы имели те же tintColor, что и ваши интерактивные элементы, убедитесь, что вы используете что-то большее, например, границу или цвет фона, поэтому ваши пользователи (и рецензенты Apple app) знают, что можно кликать и что нет.

Что касается того, как вы должны обновлять цвета, вы можете вручную установить свойство textColor как любой цвет, который вам нужен, или вам нужно создать собственный подкласс UILabel, который переопределяет - (void)tintColorDidChange для обновления свойство textColor при отправке уведомлений - позволяет вам иметь UILabel, текстовые обновления которого соответствуют tintColor его родительского элемента.

Надеюсь, это поможет!