A UISegmentedControl
имеет новый внешний вид в iOS 13, и существующий код для изменения цветов сегментированного элемента управления больше не работает так, как раньше.
До iOS 13 вы могли установить tintColor
и, которые будут использоваться для границы вокруг сегментированного элемента управления, линий между сегментами и цвета фона выбранного сегмента. Затем вы можете изменить цвет заголовков каждого сегмента, используя атрибут цвета переднего плана с titleTextAttributes
.
Под iOS 13 tintColor
ничего не делает. Вы можете настроить сегментированный элемент управления, backgroundColor
чтобы изменить общий цвет сегментированного элемента управления. Но я не могу найти способ изменить цвет, используемый в качестве фона выбранного сегмента. Настройка текстовых атрибутов все еще работает. Я даже попытался установить цвет фона заголовка, но это влияет только на фон заголовка, а не на остальную часть цвета фона выбранного сегмента.
Короче говоря, как изменить цвет фона текущего выбранного сегмента UISegmentedControl
в iOS 13? Есть ли подходящее решение, использующее общедоступные API-интерфейсы, для которого не требуется копаться в частной структуре подпредставления?
В iOS 13 нет новых свойств UISegmentedControl
или UIControl
изменений, внесенных в UIView
него.
источник
tintColor
что уже описано в ответе.Начиная с Xcode 11 beta 3
См . Ответ rmaddy
Чтобы вернуть внешний вид iOS 12
Мне не удалось изменить цвет выбранного сегмента, надеюсь, это будет исправлено в предстоящей бета-версии.
Установка фонового изображения выбранного состояния не работает без установки фонового изображения нормального состояния (что удаляет все стили iOS 13)
Но мне удалось вернуть его к внешнему виду iOS 12 (или достаточно близко, я не смог вернуть радиус угла до меньшего размера).
Это не идеально, но ярко-белый сегментированный элемент управления выглядит немного неуместно в нашем приложении.
(Не осознавал,
UIImage(color:)
что в нашей кодовой базе есть метод расширения. Но код для его реализации есть в сети)источник
setTitleTextAttributes
чтобы сделать заголовок выбранного сегмента белым цветом?IOS 13 и Swift 5.0 (Xcode 11.0) Управление сегментами 100% работает
источник
Я пробовал обходной путь, и он отлично мне подходит. Вот версия Objective-C:
источник
CGRectMake(0.0f, 0.0f, 1.0f, 1.0f)
: из моих тестов с бета-версией Xcode 11rect
должен был быть того же размера, что и границы сегментированного элемента управления.[[UISegmentedControl appearance] ensureiOS12Style]
я получаю исключение. Есть идеи, что происходит?Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSMethodSignature getArgumentTypeAtIndex:]: index (2) out of bounds [0, 1]'
Начиная с Xcode 11 beta 3
Спасибо @rmaddy!
Оригинальный ответ для Xcode 11 beta и beta 2
С бета-версией Xcode 11.0 кажется сложной задачей сделать это по правилам, потому что в основном требуется перерисовывать все фоновые изображения для каждого состояния самостоятельно, с закругленными углами, прозрачностью и
resizableImage(withCapInsets:)
. Например, вам нужно будет создать цветное изображение, подобное:Так что на данный момент способ «давайте копаться в подпредставлениях» кажется намного проще:
Это решение правильно применит цвет оттенка к выделению, как в:
источник
setBackgroundImage
для.normal
, вы должны установить все другие изображения ( в том числе других государств иsetDividerImage
), возможно , с некоторымиUIBezierPath
иresizableImage(withCapInsets:)
, что делает его слишком сложным , если мы хотим , чтобы дизайн IOS 13 сюда.selectedSegmentTintColor
собственность наUISegmentedControl
.Быстрая версия ответа @Ilahi Charfeddine:
источник
источник
iOS13 UISegmentController
как пользоваться:
источник
XCODE 11.1 и iOS 13
На основе ответа @Jigar Darji, но более безопасной реализации.
Сначала мы создаем сбойный инициализатор удобства:
Затем мы расширяем UISegmentedControl:
источник
Вот мой вариант ответа Джонатана для Xamarin.iOS (C #), но с исправлениями для изменения размера изображения. Как и в случае с комментарием Кера к ответу Колина Блейка, я сделал все изображения, кроме разделителя, размером с сегментированный элемент управления. Разделитель равен 1x высоте сегмента.
источник
Вы можете реализовать следующий метод
Код использования
источник
Хотя приведенные выше ответы прекрасны, большинство из них неправильно окрашивают текст внутри выделенного сегмента. Я создал
UISegmentedControl
подкласс, который вы можете использовать на устройствах iOS 13 и до iOS 13, и использовать свойство tintColor, как на устройствах до iOS 13.Используя
tintColorDidChange
метод, мы гарантируем, чтоstylize
метод будет вызываться каждый раз приtintColor
изменении свойства в представлении сегмента или любом из базовых представлений, что является предпочтительным поведением в iOS.Результат:
источник
Немного расширяя ответ Джонатана, если вам не нужны закругленные углы
источник