Согласно MDN
Предупреждение. Пятое издание ECMAScript (ES5) запрещает использование arguments.callee () в строгом режиме. Избегайте использования arguments.callee () путем предоставления выражений функции имени или использования объявления функции, где функция должна вызывать себя.
Как уже отмечалось, это применимо только в том случае, если ваш скрипт использует «строгий режим», , Это в основном по соображениям безопасности и, к сожалению, в настоящее время альтернативы этому нет.
это очень просто, если вы используете 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)
}
}
}
Лучший способ - добавить ограничения в 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;
}
UICollectionViewControll
, поэтому ограничения для UICollectionView
устанавливаются по умолчанию. А для InputAccessoryView
также я не задал никаких ограничений, которые появляются по умолчанию. self.autoresizingMask = .flexibleHeight
Я установил только это свойство в представление InputAccessoryView
, которое настраивает его по высоте на содержимое внутри него.
– user9496018
13 July 2018 в 07:22
inputAccessoryView
для ввода сообщения и клавиатуры, он дает высоту 50, которая равна высоте inputAccessoryView
. Это означает, что я не получаю фактическую высоту клавиатуры.
– user9496018
13 July 2018 в 07:48
В этой теме я отвечаю на этот вопрос, проблема была с UIKeyboardFrameBeginUserInfoKey
вместо того, что я использовал UIKeyboardFrameEndUserInfoKey
let indexPath = IndexPath(item: self.messages.count - 1, section: 0) self.collectionView?.scrollToItem(at: indexPath, at: .bottom, animated: true)
эти две линии делают то же, что вы предложили. – user9496018 17 July 2018 в 06:24UIKeyboardFrameBeginUserInfoKey
, из-за этого я не получал фактическую высоту клавиатуры. Вместо этого я использовал этотUIKeyboardFrameEndUserInfoKey
, и теперь я могу получить высоту клавиатуры. Оставшаяся проблема заключалась в том, что при вызове методаKeyboardWillHide
он автоматически вызываетKeyboardWillShow
, но в это время по методуKeyboardWillShow
высота клавиатуры была не 50, а фактическая высота. – user9496018 18 July 2018 в 06:08UICollectionViewInsets
- это решение, которое я разместил. [Д0] решение – user9496018 18 July 2018 в 06:08