Как я могу остановить сброс нижнего края UITextView к 32?

У меня есть полноэкранный UITextView, который уменьшается при появлении клавиатуры, чтобы клавиатура не покрывала текст. Как часть этого, я также изменяю нижний contentInset textView, так что пространство под текстом меньше, когда клавиатура присутствует, и больше, когда нет клавиатуры.

Проблема заключается в том, что всякий раз, когда пользователь нажимает текстовое представление около нижней части, чтобы начать редактирование, нижний контент Inset самопроизвольно сбрасывается до 32. Я знаю из этого ответа, что возможно создать подкласс UITextView и переопределить contentInset метод, как это:

@interface BCZeroEdgeTextView : UITextView
@end

@implementation BCZeroEdgeTextView

- (UIEdgeInsets) contentInset 
  { 
  return UIEdgeInsetsZero; 
  }

@end

Но это не останавливает саму перезагрузку нижней вставки - она ​​просто меняет фигуру, к которой она сбрасывается. Как я могу заставить свой UITextView просто сохранять значение contentInset, которое я установил?

2 ответа

Решение

Чтобы оно сохраняло заданное вами значение, вы можете пойти по пути подкласса, но вернуть значение вашего собственного свойства, а не константу, что-то вроде этого:

@interface BCCustomEdgeTextView : UITextView
@property (nonatomic, assign) UIEdgeInsets myContentInset;
@end

@implementation BCCustomEdgeTextView

@synthesize myContentInset;

- (UIEdgeInsets) contentInset { 
    return self.myContentInset; 
}

@end

Но учтите, что причина, по которой UITextView сбрасывает свой нижний contentInset на 32, заключается в том, что более стандартная вставка будет отключать всплывающие окна автозаполнения и тому подобное.

Вот мое решение, но немного дольше:

- (void)setCustomInsets:(UIEdgeInsets)theInset
{
    customInsets = theInset;
    self.contentInset = [super contentInset];
    self.scrollIndicatorInsets = [super scrollIndicatorInsets];
}

- (void)setContentInset:(UIEdgeInsets)theInset
{
    [super setContentInset:UIEdgeInsetsMake(
        theInset.top + self.customInsets.top,
        theInset.left + self.customInsets.left, 
        theInset.bottom + self.customInsets.bottom, 
        theInset.right + self.customInsets.right)];
}

- (void)setScrollIndicatorInsets:(UIEdgeInsets)theInset
{
    [super setScrollIndicatorInsets:UIEdgeInsetsMake(
        theInset.top + self.customInsets.top, 
        theInset.left + self.customInsets.left, 
        theInset.bottom + self.customInsets.bottom, 
        theInset.right + self.customInsets.right)];
}

Подкласс UITextView и добавить недвижимость customInsetsвсякий раз, когда вам нужно установить contentInset а также scrollIndicatorInsets, задавать customInsets вместо.

Другие вопросы по тегам