Ответ 1
UILabels
являются подклассом UIView
, поэтому, когда вы работаете в iOS 7, они будут иметь свойство tintColor
и наследуют этот цвет от своего родительского представления, если их цвет оттенка установлен на nil
( который по умолчанию).
По умолчанию цвет оттенков просмотров равен 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
его родительского элемента.
Надеюсь, это поможет!