A UISegmentedControl
tiene una nueva apariencia en iOS 13 y el código existente para alterar los colores del control segmentado ya no funciona como lo hacía.
Antes de iOS 13, podía configurar tintColor
y que se usaría para el borde alrededor del control segmentado, las líneas entre los segmentos y el color de fondo del segmento seleccionado. Luego, podría cambiar el color de los títulos de cada segmento usando el atributo de color de primer plano con titleTextAttributes
.
Bajo iOS 13, tintColor
no hace nada. Puede configurar los controles segmentados backgroundColor
para cambiar el color general del control segmentado. Pero no puedo encontrar ninguna forma de alterar el color utilizado como fondo del segmento seleccionado. La configuración de los atributos del texto aún funciona. Incluso intenté establecer el color de fondo del título, pero eso solo afecta al fondo del título, no al resto del color de fondo del segmento seleccionado.
En resumen, ¿cómo se modifica el color de fondo del segmento actualmente seleccionado de a UISegmentedControl
en iOS 13? ¿Existe una solución adecuada, utilizando API públicas, que no requiera profundizar en la estructura de subvista privada?
No hay nuevas propiedades en iOS 13 para UISegmentedControl
o UIControl
y ninguno de los cambios UIView
son relevantes.
fuente
tintColor
que ya está cubierto en la respuesta.A partir de Xcode 11 beta 3
Ver la respuesta de rmaddy
Para recuperar la apariencia de iOS 12
No pude teñir el color del segmento seleccionado, espero que se solucione en una próxima versión beta.
Configurar la imagen de fondo del estado seleccionado no funciona sin configurar la imagen de fondo del estado normal (que elimina todo el estilo de iOS 13)
Pero pude devolverlo a la apariencia de iOS 12 (o lo suficientemente cerca, no pude devolver el radio de la esquina a su tamaño más pequeño).
No es ideal, pero un control segmentado de color blanco brillante parece un poco fuera de lugar en nuestra aplicación.
(No sabía que
UIImage(color:)
era un método de extensión en nuestro código base. Pero el código para implementarlo está en la web)fuente
setTitleTextAttributes
para que el título del segmento seleccionado tenga un color blanco?IOS 13 y Swift 5.0 (Xcode 11.0) Control de segmento 100% funcionando
fuente
Probé la solución alternativa y me funciona muy bien. Aquí está la versión Objective-C:
fuente
CGRectMake(0.0f, 0.0f, 1.0f, 1.0f)
: de mis pruebas con Xcode 11 beta,rect
tenía que ser del mismo tamaño que los límites del control segmentado.[[UISegmentedControl appearance] ensureiOS12Style]
, obtengo una excepción. ¿Alguna idea de lo que está pasando?Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSMethodSignature getArgumentTypeAtIndex:]: index (2) out of bounds [0, 1]'
A partir de Xcode 11 beta 3
¡Gracias @rmaddy!
Respuesta original, para Xcode 11 beta y beta 2
Con Xcode 11.0 beta, parece ser un desafío hacerlo según las reglas, porque básicamente requiere volver a dibujar todas las imágenes de fondo para cada estado usted mismo, con esquinas redondeadas, transparencia y
resizableImage(withCapInsets:)
. Por ejemplo, necesitaría generar una imagen coloreada similar a:Entonces, por ahora, la forma de profundizar en las subvistas parece mucho más fácil:
Esta solución aplicará correctamente el color del tinte a la selección, como en:
fuente
setBackgroundImage
hace.normal
, debe configurar todas las demás imágenes (incluidos otros estados ysetDividerImage
), probablemente con algunasUIBezierPath
yresizableImage(withCapInsets:)
, lo que lo hace demasiado complejo si queremos el diseño de iOS 13 de esta manera.selectedSegmentTintColor
propiedadUISegmentedControl
.La versión rápida de @Ilahi Charfeddine responde:
fuente
fuente
iOS13 UISegmentController
cómo utilizar:
fuente
XCODE 11.1 y iOS 13
Basado en la respuesta de @Jigar Darji pero una implementación más segura.
Primero creamos un inicializador de conveniencia que falla:
Luego extendemos UISegmentedControl:
fuente
Aquí está mi opinión sobre la respuesta de Jonathan. Para Xamarin.iOS (C #), pero con correcciones para el tamaño de la imagen. Al igual que con el comentario de Cœur sobre la respuesta de Colin Blake, hice todas las imágenes excepto el divisor del tamaño del control segmentado. El divisor es 1 x altura del segmento.
fuente
Puede implementar el siguiente método
Código de uso
fuente
Si bien las respuestas anteriores son excelentes, la mayoría de ellas obtienen mal el color del texto dentro del segmento seleccionado. He creado
UISegmentedControl
subclase que se puede utilizar en IOS 13 y 13 pre-IOS dispositivos y usar la propiedad tintColor como lo haría en pre IOS 13 dispositivos.Al usar el
tintColorDidChange
método, nos aseguramos de questylize
se llamará al método cada vez que latintColor
propiedad cambie en la vista de segmento, o en cualquiera de las vistas subyacentes, que es el comportamiento preferido en iOS.Resultado:
fuente
Ampliando un poco la respuesta de Jonathan en caso de que no quieras redondear las esquinas
fuente