Zmień kolor kursora / pola UITextField i UITextView


222

Zastanawiam się nad zmianą koloru kursora / karetki w UITextField(i UITextViewjeśli to ta sama odpowiedź) w iOS. Widziałem odpowiedzi na rozwój OSX, ale nic na iOS.

Czy to w ogóle możliwe?


1
Szczegółowa odpowiedź UITextField, w tym jak to zrobić w Konstruktorze interfejsów, na stackoverflow.com/a/18759577/1709587
Mark Amery

1
Prosta i kompletna odpowiedź na stackoverflow.com/a/18945907/1292230 ;)
RileyE

Odpowiedzi:


512

Jeśli celujesz w iOS 7+, stało się to znacznie łatwiejsze. Wystarczy zmienić tintColorpole za pomocą kursora, używając proxy wyglądu, a będzie ono obowiązywać w całej aplikacji:

Swift 3.0:

UITextField.appearance().tintColor = .black 

Cel C:

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

Ta sama odpowiedź dotyczy osoby UITextField:

Swift 3.0:

myTextField.tintColor = .black 

Cel C

[myTextField setTintColor:[UIColor blackColor]];

13
Odkryłem, że spowodowało to, że kolory mojego odcienia elementu UIBarButton zostały ustawione na wartości domyślne, nawet jeśli ustawię kolor odcienia na coś zupełnie innego. Rozwiązałem problem, ustawiając indywidualnie kolor odcienia pól UITextField podczas ich tworzenia.
willtalmadge

To działa, ale tylko jeśli robisz to w didFinishLaunching? Czy możesz to zrobić na podstawie interakcji użytkownika, np. Nacisnąć przycisk?
Steffen Andersen

@SteffenAndersen powinien zachowywać się zgodnie z dokumentacją interfejsu API proxy UIAppearance.
DiscDev

[[Wygląd UITextView] setTintColor: teal]; z jakiegoś powodu zmienia to kolor moich przycisków nawigacyjnych, jak ustawiłeś osobno?
John

3
W Swift 3.0 użyj tego: UITextField.appearance (). TintColor = UIColor.black
Lucas Torquato

44

W systemie iOS7 możesz po prostu zmienić tintColor pola tekstowego


20

Swift 3:

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

1
W Swift 3.0 użyj tego: UITextField.appearance (). TintColor = UIColor.black
Lucas Torquato

13

Uwaga: ta odpowiedź jest nieaktualna i należy jej używać wyłącznie do programowania w wersji wcześniejszej niż iOS 7. Zobacz inne odpowiedzi na rozwiązanie 1-liniowe, używając proxy wyglądu w iOS 7.

Doszedłem do tego pytania, gdy napotkałem ten sam problem w projekcie, nad którym pracowałem.

Udało mi się stworzyć rozwiązanie, które zostanie zaakceptowane przez zespół recenzentów AppStore, ponieważ nie korzysta z żadnych istniejących prywatnych interfejsów API.

Utworzyłem formant o nazwie DGTextField, który rozszerza UITextField.


To jest świetne. Szczerze mówiąc, z tego powodu zdecydowanie będę uważniej przyglądać się „Zgodności z” w dokumentacji. Cieszę się jednak, że tylko jedna osoba musiała spędzać czas na czytaniu i majstrowaniu przy tym. Mam nadzieję, że inni ludzie będą mogli to zobaczyć i używać!
RileyE

Mogę jednak polecić opcje animacji, usuwając @propery i po prostu tworząc settery i gettery, a także setter i getter dla niestandardowej szerokości daszka. Możesz nie być zainteresowany, ale zawsze uwielbiam małe poprawki!
RileyE

@ RileyE Cieszę się, że mogłeś skorzystać z mojego rozwiązania. Zachęcamy do rozwinięcia repozytorium i dodania wszelkich poprawek, którymi chcesz się podzielić.
Dow

3
W iOS 7 jest o wiele łatwiej - zobacz moją odpowiedź poniżej: stackoverflow.com/a/18945907/1103584
DiscDev 24.09.2013

12
yourTextField.tintColor = [UIColor whiteColor];

Działa, jeśli ustawisz go w kodzie, ponieważ w jakiś sposób wyzwalacz kolorów nie robi tego w Konstruktorze interfejsów (Xcode 6.1.1). Pasował dobrze bez potrzeby zmiany jakiegokolwiek wyglądu proxy.


2
Z jakiegoś nieznanego powodu nie działa dla mnie z whiteColor, ale działa z każdym innym kolorem (testowanie na iOS 8). Musiałem ustawić kolor, który jest prawie biały, ale nie biały, aby działał.
Leszek Szary

@LeszekSzary Hej! Uratowałeś mi dzień! Próbowałem prawie 4 godziny, a twoje słowa były wskazówką! Apple powinno naprawić ten zwariowany błąd, który rzeczywiście doprowadza programistę do szaleństwa.
Karthick Ramesh

10

Ustawienie tintColordla UITextFieldi UITextViewdziała inaczej. Podczas gdy UITextFieldnie musisz wywoływać dodatkowego kodu po aktualizacji, tintColoraby zmienić kolor kursora, ale UITextViewpotrzebujesz.

Więc po ustawieniu tintColorna UITextView(nie ma znaczenia, w IB lub w kodzie) trzeba zadzwonić textView.tintColorDidChange()w celu jej zastosowania (właściwie to minie config widoku tekstu w dół hierarchii subviews).


5

To zadziałało dla mnie szybko:

UITextField.tintColor = UIColor.blackColor()

Możesz to również ustawić w serii ujęć: https://stackoverflow.com/a/18759577/3075340


To nie działa Instance member 'tintcolor' cannot be used on type 'UITextField'
Wystąpił

@pableiros Powyższe dotyczyło Swift 2. Może używasz teraz Swift 3?
Micro

Próbowałem na Swift 3 i Swift 2.3, nie jestem pewien, czy na Swift 2.2 i niższych działa
pableiros

3

Bardziej ogólnym podejściem byłoby ustawienie tintColor wyglądu UIView.

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

Ma sens, jeśli używasz wielu domyślnych elementów interfejsu użytkownika.


2
Hmmm ... ma to wiele innych skutków ubocznych ... pytanie dotyczy tylko zmiany koloru karetki, a twoja odpowiedź będzie zabarwić każdy UIView w aplikacji ... prawdopodobnie nie jest to podejście, którego większość ludzi chce brać.
DiscDev

+1 na to, zbyt wiele efektów ubocznych, jeśli celem jest tylko zmiana koloru karetki. Ustawienie tintColor UIView JEST przydatne, gdy projektujesz pojemnik (ale wtedy nie [UIView appearance]
użyłbym

2

Spróbuj, działa na mnie.

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

6
To metoda prywatna, ale dziękuję za sugestię. W ten sposób można łatwo odrzucić wniosek.
RileyE


0

Podejście Durgesh działa.

Wiele razy korzystałem z takich rozwiązań KVC. Mimo, że wydaje się to nieudokumentowane, ale działa. Szczerze mówiąc, nie używasz tutaj żadnych prywatnych metod - tylko legalne kodowanie klucz-wartość.

PS Wczoraj moja nowa aplikacja pojawiła się w AppStore bez żadnych problemów z tym podejściem. I nie jest to pierwszy przypadek, gdy używam KVC do zmiany niektórych właściwości tylko do odczytu (takich jak navigatonBar) lub prywatnych ivarów.


1
To nie jest metoda prywatna, ale klucze są nieudokumentowane, co oznacza, że ​​nie należy ich używać w aplikacjach w App Store. Twoje zgłoszenie może zostać odrzucone subiektywnie. Musiałeś mieć dobrego recenzenta, ponieważ wielu zostało odrzuconych za stosowanie tej metody.
RileyE

Potem mam około 10 miłych recenzentów :) i moich licznych kolegów.
malex

1
Aby to wyjaśnić, „kodowanie klucz-wartość” w tym przypadku polega na przypisaniu wartości właściwości za pomocą metody wygody. Powodem, dla którego go używamy, w przeciwieństwie do setera, jest to, że właściwość jest niedostępna / ukryta / prywatna.
RileyE,

1
Mam na myśli (może nie wiem czegoś ważnego) tylko, że dokumentacja KVC nie oznacza dosłownie żadnych ograniczeń. Z powodzeniem korzystam z nich wszystkich. Mam nadzieję, że inni też.
malex

1
Doceniany. Jednak Apple w „Umowie warunków użytkowania” stwierdza, że ​​wolno nam używać i otwarcie omawiać wszystko zawarte w ich dokumentacji oraz zabrania korzystania z nieudokumentowanych metod (uwzględniono by dostęp do metody ustawiania „textInputTraits” za pośrednictwem KVC, ponieważ właściwość jest nieudokumentowana). Zasadniczo, jeśli nie możesz znaleźć metody w dokumentacji, jest to zabronione. Zabronione nie gwarantuje jednak odrzucenia. Niektóre aplikacje zostały odrzucone z powodów zawartych w niektórych aplikacjach, które trafiły do ​​sklepu. Trafia się i chybia za pomocą nieudokumentowanych metod.
RileyE,

0

Dla wersji Konstruktora interfejsów z Swift

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

0

Jeśli UITextFieldjest od, UISearchBarnajpierw pobierz textFieldod, searchBara następnie zastosuj tintColorwłaściwość:

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

0

Szybki 4

W viewDidLoad () wystarczy wywołać poniższy kod:

PRÓBKA KODU

//txtVComplaint is a textView

txtVComplaint.tintColor = UIColor.white

txtVComplaint.tintColorDidChange()

0

Myślę, że jeśli chcesz jakieś niestandardowe kolory, możesz przejść do Assets.xcassetsfolderu, kliknąć prawym przyciskiem myszy i wybrać New Color Set, po utworzeniu ustawionego koloru, nadaj mu nazwę, aby go ponownie użyć.

I możesz użyć tego w następujący sposób:

import UIKit 

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

Testowane na macOS 10.15 / iOS 13 / Swift 5


0

Dla osób szukających odpowiednika w SwiftUI Textfieldjest to accentColor:

TextField("Label", text: $self.textToBind).accentColor(Color.red)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.