Getting and Setting Cursor Position of UITextField and UITextView in Swift
The following content applies to both UITextField
and UITextView
.
Useful information
The very beginning of the text field text:
let startPosition: UITextPosition = textField.beginningOfDocument
The very end of the text field text:
let endPosition: UITextPosition = textField.endOfDocument
The currently selected range:
let selectedRange: UITextRange? = textField.selectedTextRange
Get cursor position
if let selectedRange = textField.selectedTextRange {
let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start)
print("\(cursorPosition)")
}
Set cursor position
In order to set the position, all of these methods are actually setting a range with the same start and end values.
To the beginning
let newPosition = textField.beginningOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
To the end
let newPosition = textField.endOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
To one position to the left of the current cursor position
// only if there is a currently selected range
if let selectedRange = textField.selectedTextRange {
// and only if the new position is valid
if let newPosition = textField.position(from: selectedRange.start, offset: -1) {
// set the new position
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}
}
To an arbitrary position
Start at the beginning and move 5 characters to the right.
let arbitraryValue: Int = 5
if let newPosition = textField.position(from: textField.beginningOfDocument, offset: arbitraryValue) {
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}
Related
Select all text
textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument)
Select a range of text
// Range: 3 to 7
let startPosition = textField.position(from: textField.beginningOfDocument, offset: 3)
let endPosition = textField.position(from: textField.beginningOfDocument, offset: 7)
if startPosition != nil && endPosition != nil {
textField.selectedTextRange = textField.textRange(from: startPosition!, to: endPosition!)
}
Insert text at the current cursor position
textField.insertText("Hello")
Notes
Use
textField.becomeFirstResponder()
to give focus to the text field and make the keyboard appear.See this answer for how to get the text at some range.
See also
- How to Create a Range in Swift
Getting the cursor position of UITextField in ios
UITextField
conforms to the UITextInput
protocol which has methods for getting the current selection. But the methods are complicated. You need something like this:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if (textField.tag == 201) {
UITextRange *selRange = textField.selectedTextRange;
UITextPosition *selStartPos = selRange.start;
NSInteger idx = [textField offsetFromPosition:textField.beginningOfDocument toPosition:selStartPos];
[myclass selectTextForInput:textField atRange:NSMakeRange(idx, 0)];
}
}
UITextField starting cursor position is wrong
You need to always update your UI from the main thread:
DispatchQueue.main.async {
textField.selectedTextRange = textField.textRange(from: textField.endOfDocument, to: textField.endOfDocument)
}
How to set cursor position for UITextView on user input?
So I ended up adding a UILabel over the UITextView
which acts as a placeholder for the textView. Tapping on the UILabel would send the action down to the textView and becomeFirstResponder
. Once you start typing, make the label hidden.
How to set custom cursor position of UITextField?
Instead of moving the cursor you can add padding to the left of the UITextFiled like this for design to look better
UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 20)];
textField.leftView = paddingView;
textField.leftViewMode = UITextFieldViewModeAlways;
UITextField set cursor to start text position
Set your view controller (or some other appropriate object) as the text field's delegate
and implement the textFieldDidBeginEditing:
method like this:
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
UITextPosition *beginning = [textField beginningOfDocument];
[textField setSelectedTextRange:[textField textRangeFromPosition:beginning
toPosition:beginning]];
}
Note that setSelectedTextRange:
is a protocol method of UITextInput
(which UITextField
implements), so you won't find it directly in the UITextField
documentation.
set cursor in centre position of textfield
just Make textfield text alignment center. if you want to change the cursor position write the code in textfieldDidBeginEditing.
Related Topics
iPhone - Draw Transparent Rectangle on Uiview to Reveal View Beneath
Avcapturesession with Multiple Previews
Setting Selected Image in Tab Bar Controller with Storyboard
Levenshtein Distance Algorithm Better Than O(N*M)
Class Has No Initializers Swift
How to Differentiate Between Iphone4 and iPhone 3
Sharing Data Between an iOS 8 Share Extension and Main App
How Does Apple Notify iOS Apps of Refunds of In-App Purchases (Iap)
How to Get Rgb Values from Uicolor
How to Send a Silent Push Notification Payload
How to Create P12 Certificate for iOS Distribution
How to Add Equal Spacing and Equal Width for Button in iOS Auto Layout
Conversion from Nstimeinterval to Hour,Minutes,Seconds,Milliseconds in Swift
Steps to Upload an iPhone Application to the Appstore
How to Set iOS Status Bar Background Color in React Native
It's Possible to Change Push Notification Message Before Display on Device from iOS Side