有时候需要这样一个需求,就是让textField的光标处于开始位置,而且开始的时候textField里面是有内容的,比如回复评论时,会把评论的内容和作者放在后面,然后在前面写自己的回复内容。实现起来也简单,两种方法,一种是创建一个类别,一个是直接光标位置属性改变。
方法一:创建一个类别UITextField (GuangBiao)
.h文件内容写三个方法
- (NSInteger)curOffset;
- (void)makeOffset:(NSInteger)offset;
- (void)makeOffsetFromBeginning:(NSInteger)offset;
.m文件内容
- (NSInteger)curOffset{
// 基于文首计算出到光标的偏移数值。
return [self offsetFromPosition:self.beginningOfDocument toPosition:self.selectedTextRange.start];
}
- (void)makeOffset:(NSInteger)offset{
// 实现原理是先获取一个基于文尾的偏移,然后加上要施加的偏移,再重新根据文尾计算位置,最后利用选取来实现光标定位。
UITextRange *selectedRange = [self selectedTextRange];
NSInteger currentOffset = [self offsetFromPosition:self.endOfDocument toPosition:selectedRange.end];
currentOffset += offset;
UITextPosition *newPos = [self positionFromPosition:self.endOfDocument offset:currentOffset];
self.selectedTextRange = [self textRangeFromPosition:newPos toPosition:newPos];
}
- (void)makeOffsetFromBeginning:(NSInteger)offset{
// 先把光标移动到文首,然后再调用上面实现的偏移函数。
UITextPosition *begin = self.beginningOfDocument;
UITextPosition *start = [self positionFromPosition:begin offset:0];
UITextRange *range = [self textRangeFromPosition:start toPosition:start];
[self setSelectedTextRange:range];
[self makeOffset:offset];
}
self.TF1.text = @"我的院子,你的在哪里";
self.TF1.delegate = self;
[self.TF1 becomeFirstResponder];
[self.TF1 addTarget:self action:@selector(textFieldChanged:) forControlEvents:UIControlEventEditingChanged];
在textField代理的方法内:
- (void)textFieldDidBeginEditing:(UITextField *)textField{
//自己调整距离开始位置的数值
[self.TF1 makeOffsetFromBeginning:0];
}
这样就已经实现了,如果想要光标一直处于开始的位置,再加上下面方法:
- (void)textFieldChanged:(UITextField *)textField{
[self.TF1 makeOffsetFromBeginning:0];
}
方法二:直接代码搞定,还是写在上面的代理方法中,代码如下:
UITextRange * range = textField.selectedTextRange;
UITextPosition * start = [textField positionFromPosition:range.start inDirection:UITextLayoutDirectionLeft offset:textField.text.length];
if (start) {
[textField setSelectedTextRange:[textField textRangeFromPosition:start toPosition:start]];
}