iOS-调节UITextField和UITextView的光标位置

有时候需要这样一个需求,就是让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]];
}

你可能感兴趣的:(我的作品)