UITextField 插入符号太大时停止移动

UITextField Caret stops moving around when too large

UITextField 允许您在子类中覆盖 -caretRectForPosition:。我希望插入符号覆盖文本字段的整个高度。

- (CGRect)caretRectForPosition:(UITextPosition *)position
{
    CGRect inherited = [super caretRectForPosition:position];
    inherited.origin.y = -50.0;
    inherited.size.height = 200.0;

    return inherited;
}

但是,如果我将其设置得太大(如示例中所示),它将停止随放大镜四处移动,有效地使用户无法切换到文本的另一部分。

为什么会这样,我该如何解决这个问题?

我认为这只是在尝试使插入符比文本字段大时出现的问题。使其覆盖唯一的整个编辑矩形效果很好。

- (CGRect)caretRectForPosition:(UITextPosition *)position
{
    CGRect const inherited = [super caretRectForPosition:position];
    CGRect const rect = ({
        CGRect rect = inherited;
        rect.origin.y = 0.0;
        rect.size.height = CGRectGetHeight([self editingRectForBounds:self.bounds]);
        rect;
    });

    return rect;
}

奖励: 如果您试图让选择范围视图的高度相同,请查看 -selectionRectsForRange: 并调整所有视图的大小相应地纠正。不过,您需要子类化 UITextSelectionRect 以使其可变。