Alterar a cor do cursor / cursor do UITextField e do UITextView


222

Estou pensando em mudar a cor do cursor / cursor em um UITextField(e UITextViewse é a mesma resposta) no iOS. Vi respostas para o desenvolvimento do OSX, mas nada para o iOS.

Isso é possível?


1
Resposta detalhada para UITextField, incluindo como fazer isso no Interface Builder, em stackoverflow.com/a/18759577/1709587
Mark Amery

1
Resposta simples e completa em stackoverflow.com/a/18945907/1292230 ;)
RileyE

Respostas:


513

Se você está segmentando o iOS 7 ou superior, isso ficou muito mais fácil. Basta alterar o tintColorcampo com um cursor usando o proxy de aparência e ele será aplicado em todo o aplicativo:

Swift 3.0:

UITextField.appearance().tintColor = .black 

Objetivo-C:

[[UITextField appearance] setTintColor:[UIColor blackColor]];

A mesma resposta se aplica a um indivíduo UITextField:

Swift 3.0:

myTextField.tintColor = .black 

Objetivo-C

[myTextField setTintColor:[UIColor blackColor]];

13
Descobri que isso fazia com que minhas cores de tonalidade de item UIBarButton se tornassem fixas em seus valores padrão, mesmo se eu definir a cor de tonalidade para algo completamente diferente. Eu resolvi o problema definindo a cor da tonalidade dos UITextFields individualmente quando eles são criados.
precisa saber é o seguinte

Isso funciona, mas somente se você fizer isso em didFinishLaunching? Ou você pode fazer isso com base na interação do usuário, por exemplo, pressionar um botão?
Steffen Andersen

@SteffenAndersen deve se comportar de acordo com a documentação da API do proxy UIAppearance.
precisa saber é o seguinte

[[Aparência do UITextView] setTintColor: teal]; por alguma razão, isso muda a cor dos meus botões da barra de navegação, como você definiu individualmente?
John

3
Em Swift 3,0 utilização deste: UITextField.appearance () tintColor = UIColor.black.
Lucas Torquato

44

Com o iOS7, você pode simplesmente alterar tintColor do campo de texto


20

Swift 3:

  UITextField.appearance().tintColor = UIColor.black
  UITextView.appearance().tintColor = UIColor.black

1
Em Swift 3,0 utilização deste: UITextField.appearance () tintColor = UIColor.black.
Lucas Torquato

13

Nota: Esta resposta está desatualizada e deve ser usada apenas para o desenvolvimento anterior ao iOS 7. Veja outras respostas para uma solução de 1 linha usando o proxy de aparência no iOS 7.

Cheguei a essa pergunta depois de enfrentar o mesmo problema em um projeto em que estava trabalhando.

Consegui criar uma solução que será aceita pela equipe de revisão da AppStore, pois ela não usa APIs privadas existentes.

Eu criei um controle chamado DGTextField que estende o UITextField.


Isso é ótimo. Honestamente, por isso, definitivamente ficarei de olho em "Conformidade com" nos documentos. No entanto, estou feliz que apenas uma pessoa tenha passado o tempo lendo e mexendo nisso. Espero que outras pessoas possam ver e usar isso!
RileyE

No entanto, posso recomendar opções de animação, removendo o @propery e apenas criando setters e getters, bem como um setter e getter para a largura personalizada do cursor. Você pode não estar interessado, mas eu sempre amo os pequenos ajustes!
RileyE

@RileyE Estou feliz que você tenha se beneficiado da minha solução. Sinta-se à vontade para fazer o repo e adicionar quaisquer ajustes que você gostaria de compartilhar.
Dov 23/01

3
É muito mais fácil no iOS 7 - veja minha resposta abaixo: stackoverflow.com/a/18945907/1103584
DiscDev

12
yourTextField.tintColor = [UIColor whiteColor];

Funciona se você o definir no código, porque, de alguma forma, o gatilho de cores não o faz no Interface Builder (Xcode 6.1.1). É adequado sem a necessidade de alterar nenhum proxy de aparência.


2
Por algum motivo desconhecido, ele não funciona para mim com whiteColor, mas funciona com todas as outras cores (teste no iOS 8). Eu tive que definir uma cor quase branca, mas não branca, para fazê-la funcionar.
Leszek Szary

@LeszekSzary Hey! Você salvou o meu dia! Eu estava tentando quase 4 horas e suas palavras foram a pista! A Apple deve corrigir esse bug maluco que realmente deixa o desenvolvedor louco.
Karthick Ramesh

10

Configuração tintColorpara UITextFielde UITextViewfunciona de forma diferente. Enquanto UITextFieldvocê não precisar chamar um código adicional após a atualização tintColorpara alterar a cor do cursor, UITextViewé necessário.

Então, depois de definir tintColorpara UITextView(não importa em IB ou em código) você precisa chamar textView.tintColorDidChange()a fim de aplicá-lo (na verdade, ele vai passar de configuração de exibição de texto para baixo a sua hierarquia subviews).


5

Isso funcionou para mim rapidamente:

UITextField.tintColor = UIColor.blackColor()

Você também pode definir isso no storyboard: https://stackoverflow.com/a/18759577/3075340


Isso não funciona. Eu obtive o erro:Instance member 'tintcolor' cannot be used on type 'UITextField'
pableiros 2/16

@pableiros O anterior foi com o Swift 2. Talvez você esteja usando o Swift 3 agora?
Micro

Tentei em Swift 3 e Swift 2.3, eu não tenho certeza se a Swift 2.2 e abaixar ele funciona
pableiros

3

Uma abordagem mais geral seria definir a tintColor da aparência do UIView.

UIColor *myColor = [UIColor purpleColor];
[[UIView appearance] setTintColor:myColor];

Faz sentido se você estiver usando muitos elementos da interface do usuário padrão.


2
Hmmm ... isso tem muitos outros efeitos colaterais ... a pergunta é apenas sobre a alteração da cor do sinal de intercalação, e sua resposta tingirá cada UIView no aplicativo ... essa provavelmente não é a abordagem que a maioria das pessoas deseja pegar.
DiscDev 04/10

+1 nisso, muitos efeitos colaterais, se o objetivo for apenas alterar a cor do cursor. Definir UIView tintColor é útil quando você está denominando um recipiente (mas então eu não usaria[UIView appearance]
colinta

2

Tente, está funcionando para mim.

[[self.textField valueForKey:@"textInputTraits"] setValue:[UIColor redColor] strong textforKey:@"insertionPointColor"];

6
Isso está usando um método privado, mas obrigado pela sugestão. Isso pode facilmente rejeitar um aplicativo.
precisa saber é o seguinte


0

A abordagem de Durgesh funciona.

Eu também usei essas soluções KVC muitas vezes. Apesar de parecer indocumentado, mas funciona. Francamente, você não usa métodos particulares aqui - apenas a codificação de valor-chave que é legal.

PS Ontem, meu novo aplicativo apareceu na AppStore sem problemas com essa abordagem. E não é o primeiro caso em que uso o KVC na alteração de algumas propriedades somente leitura (como navigatonBar) ou ivars particulares.


1
Não está usando um método privado, mas as chaves não são documentadas, o que significa que não devem ser usadas para aplicativos na App Store. Sua inscrição pode ser rejeitada subjetivamente. Você deve ter um revisor gentil, pois muitos foram rejeitados por usar esse método.
RileyE

Então eu tenho cerca de 10 revisores gentis :) e meus numerosos colegas também.
Malex

1
Apenas para esclarecer, a "Codificação de valor-chave", neste caso, está atribuindo um valor a uma propriedade usando o método de conveniência. O motivo pelo qual estamos usando isso, em comparação com um levantador, é porque a propriedade é inacessível / oculta / privada.
RileyE

1
Aqui, quero dizer (talvez eu não saiba algo importante), apenas que a documentação no KVC não implica nenhuma restrição literalmente. Então, eu uso com sucesso tudo isso. E espero que outros possam.
Malex

1
Estimado. No entanto, a Apple, em seu 'Contrato de Termos de Uso', declara que temos permissão para usar e discutir abertamente qualquer coisa incluída em sua documentação e proíbe o uso de métodos não documentados (acessar o método setter 'textInputTraits' por meio do KVC seria incluído. propriedade não está documentada). Essencialmente, se você não conseguir encontrar o método na documentação, é proibido. Proibido não garante rejeição, no entanto. Alguns aplicativos foram rejeitados por razões incluídas em alguns dos meus aplicativos que chegam à loja. É um erro e acerto com métodos não documentados.
RileyE

0

Para a versão do Interface Builder com Swift

@IBOutlet weak var tvValue: UITextView! {
        didSet {
            tvValue.tintColor = .black
        }
    }

0

Se UITextFieldfor from UISearchBar, primeiro obtenha o textFieldfrom searchBare aplique a tintColorpropriedade:

let textFieldInsideSearchBar = searchBar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.tintColor = UIColor.lightGray

0

Swift 4

Em viewDidLoad (), basta chamar o código abaixo:

AMOSTRA DE CÓDIGO

//txtVComplaint is a textView

txtVComplaint.tintColor = UIColor.white

txtVComplaint.tintColorDidChange()

0

Eu acho que se você quiser cores personalizadas, pode ir para a Assets.xcassetspasta, clicar com o botão direito e selecionar New Color Set, depois de criar a cor que definir, dê um nome para reutilizá-la.

E você pode usá-lo assim:

import UIKit 

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        UITextField.appearance().tintColor = UIColor(named: "YOUR-COLOR-NAME")  #here
    }
}

Testado no macOS 10.15 / iOS 13 / Swift 5


0

Para as pessoas que pesquisam o equivalente no SwiftUI, Textfieldisso é accentColor:

TextField("Label", text: $self.textToBind).accentColor(Color.red)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.