Подтвердить что ты не робот

UITextView keyboardDismissMode Bug

Я только что нашел раздражающую ошибку с новым свойством keyboardDismissMode scroll view. При использовании этого параметра с text view со значением UIScrollViewKeyboardDismissModeInteractive и клавиатура отклоняется, scroll view, кажется, прыгает вверх, пока не продолжает замедляться.

Я отправил отчет об ошибке в Apple, но мне нужно обходное решение. Я пробовал DAKeyboardControl без новой поддержки iOS7, которая за кулисами использует keyboardDismissMode, и она по-прежнему делает это, что для меня указывает, что это гораздо более глубокая проблема.

Любые предложения?

4b9b3361

Ответ 1

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

Ответ 2

Кажется, это ошибка или просто не идеальное состояние по умолчанию. Но на основе кода в тестовом проекте что-то вроде ниже может работать после некоторой тонкой настройки.

Есть две проблемы с образцом кода: вы не делаете ничего о размере текста, когда клавиатура появляется, поэтому вы не можете использовать или видеть текст под клавиатурой. Существуют и другие решения, но быстрое и грязное решение заключается в изменении размера фрейма (в приложении для представления я бы также захватил информацию о анимации и анимировал изменение кадра представления, чтобы соответствовать анимации клавиатуры, которая выходит за рамки этого вопроса). Вы делаете это в 'willShow' или тому подобное, и возвращаете его обратно в 'didHide' или тому подобное.

Затем смещение содержимого затухает, когда оно скрыто, и, похоже, некоторые странные состояния, пока вы перетаскиваете его за кадром перед и вокруг ваших обратных вызовов, чтобы скрывать и просматривать изменения прокрутки. Я просто сохраняю состояние и "исправляю" его, как только клавиатура уходит, и я обновил текстовое представление.

Я создал несколько свойств и выход в раскадровке, чтобы выплыть с текстовым видом.

- (void) viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
}

- (void) keyboardWillShow:(NSNotification *)notification
{
    NSDictionary * info = [notification userInfo];
    CGSize size = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    CGRect rect = self.textView.frame;
    rect.size.height -= size.height;
    self.textView.frame = rect;
}

- (void)keyboardDidHide:(NSNotification *)notification
{
    NSLog(@"====== keyboardDidHide =======");

    NSDictionary * info = [notification userInfo];
    CGSize size = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    CGRect rect = self.textView.frame;
    rect.size.height += size.height;
    self.textView.frame = rect;


    self.hidingKeyboard = YES;
}

- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
    NSLog(@"%f", scrollView.contentOffset.y);
    if(self.hidingKeyboard == YES)
    {
        scrollView.contentOffset = self.lastOffset;
        self.hidingKeyboard = NO;
        NSLog(@"====== reset =======");
    }
    else
        self.lastOffset = scrollView.contentOffset;
}