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?
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?
Odpowiedzi:
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]];
Swift 3:
UITextField.appearance().tintColor = UIColor.black
UITextView.appearance().tintColor = UIColor.black
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.
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.
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).
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
Instance member 'tintcolor' cannot be used on type 'UITextField'
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.
[UIView appearance]
Jest to możliwe tylko poprzez dostęp do własności prywatnej i dlatego może spowodować odrzucenie aplikacji Apple AppStore.
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.
Dla wersji Konstruktora interfejsów z Swift
@IBOutlet weak var tvValue: UITextView! {
didSet {
tvValue.tintColor = .black
}
}
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
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
UITextField, w tym jak to zrobić w Konstruktorze interfejsów, na stackoverflow.com/a/18759577/1709587