Zastanawiam się nad zmianą koloru kursora / karetki w UITextField
(i UITextView
jeś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 UITextView
jeś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ć tintColor
pole 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 tintColor
dla UITextField
i UITextView
działa inaczej. Podczas gdy UITextField
nie musisz wywoływać dodatkowego kodu po aktualizacji, tintColor
aby zmienić kolor kursora, ale UITextView
potrzebujesz.
Więc po ustawieniu tintColor
na 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 UITextField
jest od, UISearchBar
najpierw pobierz textField
od, searchBar
a następnie zastosuj tintColor
wł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.xcassets
folderu, 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