Верхний край UITextView

Я использую textview и заметил, что iOS 7 оставляет верхний марж по умолчанию. См. Изображение в следующем enter image description here

Я читаю разные сообщения, в которых наиболее распространенное решение должно использовать:

[textViewTest setContentInset:UIEdgeInsetsMake(<#CGFloat top#>, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>)];

Но эти вставки - это просто настраиваемое решение для конкретного устройства, текстовое представление, размер шрифта и т.д. Поэтому нет никаких конкретных вложений, применимых к любому решению... даже хуже, мне пришлось бы программно определять разные вставки для учета всех устройств iOS и ориентации.

Хорошая новость заключается в том, что я обнаружил, что всякий раз, когда текстовое представление становится первым ответчиком, а клавиатура отображается на экране, этот верхний край исчезает даже после того, как клавиатура ушла. Кстати, я меняю размер содержимого на UIKeyboardDidShowNotification и UIKeyboardWillHideNotification.

  • См. изображение, когда клавиатура показывает:

enter image description here

  • Смотрите изображение, когда клавиатура ушла:

enter image description here

Есть ли способ имитировать показ клавиатуры и скрытие? Таким образом, содержимое вставки исчезает, как описано выше.

Я уже пробовал сделать textview первым отвечающим, а затем уйти в отставку, но для этого подхода пользователю нужно будет увидеть всю анимацию show-hide для всей клавиатуры.

Спасибо заранее!

Мой код ниже:

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
    if(self.topMarginIsAlreadyResized == NO) {
        [self.myTextView becomeFirstResponder]; // Keyboard will show to eliminate top margin when view appears
    }
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)handleKeyboardDidShow:(NSNotification *)notification {
    if(self.topMarginIsAlreadyResized == NO) {
        self.topMarginIsAlreadyResized = YES; // Once that keyboard has shown when view appears, we should hide it manually
        [self.myTextView resignFirstResponder];
    }
    NSValue *keyboardRectAsObject = [[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey];
    CGRect keyboardRect = CGRectZero;
    [keyboardRectAsObject getValue:&keyboardRect];
    self.myTextView.contentInset = UIEdgeInsetsMake(0.0f, 0.0f, keyboardRect.size.height, 0.0f);
}

- (void)handleKeyboardWillHide:(NSNotification *)notification {
    self.myTextView.contentInset = UIEdgeInsetsZero;
}

Ответ 1

Это происходит потому, что yor view controller установил свойство automaticallyAdjustsScrollViewInsets в YES, если вы установите его в NO, все будет нормально. См. question и принятый ответ для получения дополнительной информации.