I'm wondering about changing the color of the cursor / caret in a UITextField
(And UITextView
if its the same answer) in iOS. I've seen answers for OSX development, but nothing for iOS.
Is this even possible?
I'm wondering about changing the color of the cursor / caret in a UITextField
(And UITextView
if its the same answer) in iOS. I've seen answers for OSX development, but nothing for iOS.
Is this even possible?
If you're targeting iOS 7+, this has been made much easier. Simply change the tintColor
of the field with a cursor using the appearance proxy and it will apply throughout the app:
Swift 3.0:
UITextField.appearance().tintColor = .black
Objective-C:
[[UITextField appearance] setTintColor:[UIColor blackColor]];
Same answer applies for an individual UITextField
:
Swift 3.0:
myTextField.tintColor = .black
Objective-C
[myTextField setTintColor:[UIColor blackColor]];
myTextField.tintColor = .black
has no effect for me. –
Activist With iOS7 you can simply change tintColor of the textField
Swift 3:
UITextField.appearance().tintColor = UIColor.black
UITextView.appearance().tintColor = UIColor.black
yourTextField.tintColor = [UIColor whiteColor];
It works if you set it in code, 'cos somehow color trigger doesn't do it in the Interface Builder (Xcode 6.1.1). It suited well without a need to change any appearance proxy.
Note: This answer is out of date and should be used for pre-iOS 7 development only. See other answers for a 1 line solution using the appearance proxy in iOS 7.
I arrived at this question after I faced the same problem in a project I was working on.
I managed to create a solution that will be accepted by the AppStore review team as it does not use any existing Private APIs.
I have created a control called DGTextField that extends UITextField.
Setting tintColor
for UITextField
and UITextView
works differently.
While for UITextField
you don't need to call additional code after updating tintColor
to change cursor color, but for UITextView
you need.
So after setting tintColor
for UITextView
(it doesn't matter in IB or in code) you need to call textView.tintColorDidChange()
in order to apply it (actually it will pass text view's config down to its subviews hierarchy).
This worked for me in swift:
UITextField.tintColor = UIColor.blackColor()
You can also set this in storyboard: https://mcmap.net/q/118728/-change-color-of-cursor-in-uitextfield
Instance member 'tintcolor' cannot be used on type 'UITextField'
–
Morris someTextFieldInstance
instead of UITextField
, because tintColor
is an instance member –
Thierry A more general approach would be to set the UIView's appearance's tintColor.
UIColor *myColor = [UIColor purpleColor];
[[UIView appearance] setTintColor:myColor];
Makes sense if you're using many default UI elements.
[UIView appearance]
–
Guillema Try, Its working for me.
[[self.textField valueForKey:@"textInputTraits"] setValue:[UIColor redColor] strong textforKey:@"insertionPointColor"];
It is only possible by accessing a private property and therefore may cause an Apple AppStore app rejection.
I think If you want some custom colors you can go to Assets.xcassets
folder, right click and select New Color Set
, once you created you color you set, give it a name to reuse it.
And you can use it just like this :
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
UITextField.appearance().tintColor = UIColor(named: "YOUR-COLOR-NAME") #here
}
}
Tested on macOS 10.15 / iOS 13 / Swift 5
Durgesh's approach does work.
I also used such KVC solutions many times. Despite it seems to be undocumented, but it works. Frankly, you don't use any private methods here - only Key-Value Coding which is legal.
P.S. Yesterday my new app appeared at AppStore without any problems with this approach. And it is not the first case when I use KVC in changing some read-only properties (like navigatonBar) or private ivars.
For Interface Builder version with Swift
@IBOutlet weak var tvValue: UITextView! {
didSet {
tvValue.tintColor = .black
}
}
If the UITextField
is from UISearchBar
then first get the textField
from searchBar
and then apply tintColor
property:
let textFieldInsideSearchBar = searchBar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.tintColor = UIColor.lightGray
Swift 4
In viewDidLoad() just call below code:
CODE SAMPLE
//txtVComplaint is a textView
txtVComplaint.tintColor = UIColor.white
txtVComplaint.tintColorDidChange()
For people searching the equivalent in SwiftUI for Textfield
this is accentColor
:
TextField("Label", text: $self.textToBind).accentColor(Color.red)
© 2022 - 2024 — McMap. All rights reserved.
UITextField
, including how to do this in Interface Builder, at https://mcmap.net/q/118728/-change-color-of-cursor-in-uitextfield – Kary