A UISegmentedControl
tem uma nova aparência no iOS 13 e o código existente para alterar as cores do controle segmentado não funciona mais como antes.
Antes do iOS 13, você podia definir o tintColor
e que seria usado para a borda ao redor do controle segmentado, as linhas entre os segmentos e a cor de fundo do segmento selecionado. Em seguida, você pode alterar a cor dos títulos de cada segmento usando o atributo de cor de primeiro plano com titleTextAttributes
.
No iOS 13, o tintColor
não faz nada. Você pode definir o controle segmentado backgroundColor
para alterar a cor geral do controle segmentado. Mas não consigo encontrar nenhuma maneira de alterar a cor usada como fundo do segmento selecionado. Definir os atributos de texto ainda funciona. Eu até tentei definir a cor de fundo do título, mas isso afeta apenas o fundo do título, não o resto da cor de fundo do segmento selecionado.
Em suma, como você modifica a cor de fundo do segmento atualmente selecionado de a UISegmentedControl
no iOS 13? Existe uma solução adequada, usando APIs públicas, que não exija cavar na estrutura de subvisualização privada?
Não há novas propriedades no iOS 13 para UISegmentedControl
ou UIControl
e nenhuma das alterações UIView
é relevante.
fonte
tintColor
qual já foi abordada na resposta.A partir do Xcode 11 beta 3
Veja a resposta de rmaddy
Para voltar a aparência do iOS 12
Não fui capaz de tingir a cor do segmento selecionado, espero que seja corrigido em um próximo beta.
Definir a imagem de fundo do estado selecionado não funciona sem definir a imagem de fundo do estado normal (que remove todo o estilo do iOS 13)
Mas consegui voltar à aparência do iOS 12 (ou perto o suficiente, não consegui retornar o raio do canto ao seu tamanho menor).
Não é o ideal, mas um controle segmentado branco brilhante parece um pouco fora do lugar em nosso aplicativo.
(Não percebi que
UIImage(color:)
era um método de extensão em nossa base de código. Mas o código para implementá-lo está em toda a web)fonte
setTitleTextAttributes
para que o título do segmento selecionado seja branco?IOS 13 e Swift 5.0 (Xcode 11.0) Segment Control 100% Working
fonte
Eu tentei a solução alternativa e funciona muito bem para mim. Aqui está a versão Objective-C:
fonte
CGRectMake(0.0f, 0.0f, 1.0f, 1.0f)
: dos meus testes com Xcode 11 beta,rect
tinha que ser do mesmo tamanho que os limites do controle segmentado.[[UISegmentedControl appearance] ensureiOS12Style]
, recebo uma exceção. alguma ideia do que está acontecendo?Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSMethodSignature getArgumentTypeAtIndex:]: index (2) out of bounds [0, 1]'
A partir do Xcode 11 beta 3
Obrigado @rmaddy!
Resposta original, para Xcode 11 beta e beta 2
Com o Xcode 11.0 beta, parece ser um desafio fazê-lo pelas regras, porque basicamente requer redesenhar todas as imagens de fundo para cada estado por você mesmo, com cantos arredondados, transparência e
resizableImage(withCapInsets:)
. Por exemplo, você precisaria gerar uma imagem colorida semelhante a:Então, por enquanto, a maneira vamos-cavar-nos-subviews parece muito mais fácil:
Esta solução aplicará corretamente a cor da tonalidade à seleção, como em:
fonte
setBackgroundImage
para.normal
, você tem que definir todas as outras imagens (incluindo outros estados esetDividerImage
), provavelmente com algumaUIBezierPath
eresizableImage(withCapInsets:)
, o que torna excessivamente complexa se queremos que o projeto iOS 13 deste jeito.selectedSegmentTintColor
propriedade ligadaUISegmentedControl
.Versão rápida da resposta @Ilahi Charfeddine:
fonte
fonte
iOS13 UISegmentController
Como usar:
fonte
XCODE 11.1 e iOS 13
Com base na resposta de @Jigar Darji, mas uma implementação mais segura.
Primeiro, criamos um inicializador de conveniência disponível:
Em seguida, estendemos UISegmentedControl:
fonte
Aqui está minha opinião sobre a resposta de Jonathan. Para Xamarin.iOS (C #), mas com correções para dimensionamento de imagem. Como no comentário de Cœur sobre a resposta de Colin Blake, fiz todas as imagens, exceto a divisória, do tamanho do controle segmentado. O divisor é 1xaltura do segmento.
fonte
Você pode implementar o seguinte método
Código de uso
fonte
Embora as respostas acima sejam ótimas, muitas delas erram na cor do texto dentro do segmento selecionado. Eu criei uma
UISegmentedControl
subclasse que você pode usar em dispositivos iOS 13 e pré-iOS 13 e usar a propriedade tintColor como faria em dispositivos pré-iOS 13.Usando o
tintColorDidChange
método, garantimos que ostylize
método será chamado sempre que otintColor
propriedade for alterada na visualização do segmento ou em qualquer uma das visualizações subjacentes, que é o comportamento preferido no iOS.Resultado:
fonte
Expandindo um pouco a resposta de Jonathan caso você não queira cantos arredondados
fonte