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?

RileyE
źródło
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]];
DiscDev
źródło
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

Czapka
źródło
20

Swift 3:

  UITextField.appearance().tintColor = UIColor.black
  UITextView.appearance().tintColor = UIColor.black
Peter Kreinz
źródło
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.

Dow
źródło
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.

David
źródło
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).

ilya
źródło
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

Micro
źródło
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.

arnekolja
źródło
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"];
Durgesh
źródło
6
To metoda prywatna, ale dziękuję za sugestię. W ten sposób można łatwo odrzucić wniosek.
RileyE
1

Jest to możliwe tylko poprzez dostęp do własności prywatnej i dlatego może spowodować odrzucenie aplikacji Apple AppStore.

spójrz na to pytanie Stackoverflow

Max Ballo
źródło
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.

malex
źródło
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
        }
    }
Mike Glukhov
źródło
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

źródło
0

Szybki 4

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

PRÓBKA KODU

//txtVComplaint is a textView

txtVComplaint.tintColor = UIColor.white

txtVComplaint.tintColorDidChange()
Shamshad
źródło
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

rdza
źródło
0

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

TextField("Label", text: $self.textToBind).accentColor(Color.red)
Beninho85
źródło