UITextField Caret перестает перемещаться, когда слишком большой

UITextField позволяет вам переопределять -caretRectForPosition: в подклассах. Я хочу, чтобы каретка покрывала всю высоту текстового поля.

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

    return inherited;
}

Однако, если я сделаю его слишком большим (как в примере), он перестанет перемещаться с увеличительным стеклом, что фактически лишит пользователя возможности переключиться на другую часть текста.

Почему это так и как я могу решить эту проблему?


person Christian Schnorr    schedule 10.06.2015    source источник


Ответы (1)


Я подумал, что это проблема только при попытке сделать курсор больше, чем текстовое поле. Заставить его покрывать только весь прямоугольник редактирования сработало нормально.

- (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, чтобы сделать его изменяемым.

person Christian Schnorr    schedule 12.06.2015