Цвет оттенка ошибки UISegmentedControl в IOS 7.1

При установке цвета оттенка UISegmentedControl с использованием API внешнего вида цвет текста в каждом невыбранном сегменте принимает цвет UILabel вместо этого только после переключения вкладок.

Пример программы для проверки (скриншоты ниже):

  • Загрузите программу и посмотрите первую вкладку. Все нормально, метки красные, а сегменты синие.
  • Переключитесь на вторую вкладку, все по-прежнему хорошо.
  • Вернитесь к первой вкладке, вы увидите, что сегменты изменились на красные, а не на синие, как должны.

Приложение только что загрузилось, все в порядке:

Приложение только что загрузилось, все в порядке.

После переключения вкладок цвет неправильный:

После переключения вкладок цвет неправильный.

Ответственный код (в делегате приложения для тестирования, но происходит в другом месте):

[[UILabel appearance] setTextColor:[UIColor redColor]];
[[UISegmentedControl appearance] setTintColor:[UIColor blueColor]];

Я отправил эту информацию в Apple в отчете об ошибке. Они попросили образец проекта, но я еще не получил ответа. Это отображается только в IOS 7.1. На 7.0 этого не происходит.

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


person The Lone Fellow    schedule 01.04.2014    source источник
comment
Способ, которым я исправил аналогичную проблему в UISearchBar, заключался в том, чтобы динамически подклассифицировать его внутреннюю иерархию подпредставлений (для ввода sweetspot: didAddSubview:). Чертовски хакерский, но да ...   -  person Leo Natan    schedule 01.04.2014
comment
Попробуйте ввести [self.segmentControl recursiveDescription] в отладчике и опубликуйте результат. Попробуйте [[UILabel appearanceWhenContainedIn:[UISegmentedControl class], nil setTextColor:[UIColor blueColor]];   -  person Leo Natan    schedule 01.04.2014
comment
Спасибо, Лео! Внешний видWhenContainIn - это именно то, что мне нужно, работает отлично.   -  person The Lone Fellow    schedule 03.04.2014
comment
Добавил ответ. Спасибо   -  person Leo Natan    schedule 03.04.2014


Ответы (2)


Как обсуждалось в комментариях, используйте [[UILabel appearanceWhenContainedIn:[UISegmentedControl class], nil] setTextColor:[UIColor blueColor]];, чтобы установить внешний вид внутренней метки, содержащейся в элементе управления сегментом.

person Leo Natan    schedule 03.04.2014

Согласно документации Apple: установка свойства tintColor с помощью API-интерфейсов прокси внешнего вида не поддерживается в iOS 7.

Руководство по переходу на пользовательский интерфейс iOS 7

Вы также можете указать текстовые атрибуты, такие как UISegmentedControl, например font, используя setTitleTextAttributes: forState.

person Christopher Mann    schedule 22.04.2014