переместить чат просмотра коллекции, когда появится inputAccessoryView

Согласно MDN

Предупреждение. Пятое издание ECMAScript (ES5) запрещает использование arguments.callee () в строгом режиме. Избегайте использования arguments.callee () путем предоставления выражений функции имени или использования объявления функции, где функция должна вызывать себя.

Как уже отмечалось, это применимо только в том случае, если ваш скрипт использует «строгий режим», , Это в основном по соображениям безопасности и, к сожалению, в настоящее время альтернативы этому нет.

0
задан user9496018 13 July 2018 в 06:19
поделиться

3 ответа

это очень просто, если вы используете UICollectionViewController, вам не нужно управлять contentInset самим собой, просто позвольте CollectionViewController обрабатывать его самостоятельно, все, что вам нужно, это прокрутить вниз, когда ваш 'textView' или 'textField' становится первым ответчиком или когда вы отправляете сообщение

Чтобы прокрутить collectionView вниз, вы просто используете эту функцию

func scrollToBottom() {
    let numberOfSections = self.collectionView!.numberOfSections
    if numberOfSections > 0 {
        let numberOfRows = self.collectionView!.numberOfItems(inSection: numberOfSections - 1)
        if numberOfRows > 0 {
            let indexPath = IndexPath(row: numberOfRows-1, section: (numberOfSections-1))
            self.collectionView!.scrollToItem(at: indexPath, at: .bottom, animated: true)
        }
    }
}
0
ответ дан Amr Mohamed 17 August 2018 в 13:34
поделиться
  • 1
    let indexPath = IndexPath(item: self.messages.count - 1, section: 0) self.collectionView?.scrollToItem(at: indexPath, at: .bottom, animated: true) эти две линии делают то же, что вы предложили. – user9496018 17 July 2018 в 06:24
  • 2
    Первая строка получает последний индекс объекта, а вторая строка прокручивает к этой строке нижнее выравнивание, так что вы на ячейках поверх inputAccessoryView, я не понял, что вы хотите знать? – Amr Mohamed 17 July 2018 в 17:32
  • 3
    Привет @Amr проблема была UIKeyboardFrameBeginUserInfoKey, из-за этого я не получал фактическую высоту клавиатуры. Вместо этого я использовал этот UIKeyboardFrameEndUserInfoKey, и теперь я могу получить высоту клавиатуры. Оставшаяся проблема заключалась в том, что при вызове метода KeyboardWillHide он автоматически вызывает KeyboardWillShow, но в это время по методу KeyboardWillShow высота клавиатуры была не 50, а фактическая высота. – user9496018 18 July 2018 в 06:08
  • 4
    поэтому я добавляю ограничение, если высота больше 50, а затем изменение UICollectionViewInsets - это решение, которое я разместил. [Д0] решение – user9496018 18 July 2018 в 06:08

Лучший способ - добавить ограничения в collectionView и InputAccessoryView таким образом, чтобы нижнее представление коллекции было привязано к аксессуару и аксессуару в нижней части супер-представления.

Далее Сделайте вывод нижнего пространства в файл .m, а вызов - scrollViewBottomSpace и добавьте следующий код. Constrain будет работать для вас.

# прагма-метка - уведомления на клавиатуре

- (void)addObservers
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)removeObservers
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

#pragma mark - Keyboard notification handlers

- (void)keyboardWillShow:(NSNotification *)notification
{
    if(_keyboardIsVisible) return;

    CGFloat height = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;

    [UIView animateWithDuration:0.2 animations:^{
        scrollViewBottomSpace.constant = height+40;
    } completion:^(BOOL finished) {

    }];

    _keyboardIsVisible = YES;
}

- (void)keyboardWillHide:(NSNotification *)notification
{
    if(!_keyboardIsVisible) return;

    [UIView animateWithDuration:0.2 animations:^{
        scrollViewBottomSpace.constant = 0;
    } completion:^(BOOL finished) {

    }];

    _keyboardIsVisible = NO;
}
0
ответ дан Himan Dhawan 17 August 2018 в 13:34
поделиться
  • 1
    Я не использую раскадровки. Также я использую UICollectionViewControll, поэтому ограничения для UICollectionView устанавливаются по умолчанию. А для InputAccessoryView также я не задал никаких ограничений, которые появляются по умолчанию. self.autoresizingMask = .flexibleHeight Я установил только это свойство в представление InputAccessoryView, которое настраивает его по высоте на содержимое внутри него. – user9496018 13 July 2018 в 07:22
  • 2
    когда в первый раз отображается экран чата, вызов методаWillShow вызывает автоматически, и в это время я получаю фактическую высоту клавиатуры. Но после этого, когда я нажимаю inputAccessoryView для ввода сообщения и клавиатуры, он дает высоту 50, которая равна высоте inputAccessoryView. Это означает, что я не получаю фактическую высоту клавиатуры. – user9496018 13 July 2018 в 07:48

В этой теме я отвечаю на этот вопрос, проблема была с UIKeyboardFrameBeginUserInfoKey вместо того, что я использовал UIKeyboardFrameEndUserInfoKey

0
ответ дан user9496018 17 August 2018 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: