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?

RileyE
fonte
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]];
DiscDev
fonte
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

Boné
fonte
20

Swift 3:

  UITextField.appearance().tintColor = UIColor.black
  UITextView.appearance().tintColor = UIColor.black
Peter Kreinz
fonte
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.

Dov
fonte
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.

David
fonte
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).

ilya
fonte
5

Isso funcionou para mim rapidamente:

UITextField.tintColor = UIColor.blackColor()

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

Micro
fonte
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.

arnekolja
fonte
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"];
Durgesh
fonte
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.

malex
fonte
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
        }
    }
Mike Glukhov
fonte
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

fonte
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()
Shamshad
fonte
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

ferrugem
fonte
0

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

TextField("Label", text: $self.textToBind).accentColor(Color.red)
Beninho85
fonte