jsqmessagesviewcontroller inputToolBar IOS 11 iphone X Swift4

Я знаю, что эта библиотека уже устарела, но кто-нибудь исправил проблему с inputToolBar и iPhone X? В настоящее время inputToolBar частично покрыт. Проверьте прикрепленное изображение.

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

6 ответов

Решение

Ребята, я тот, кто спрашивает jsqmessageviewcontroller панель инструментов ios11, и я понял это!

Просто поместите следующий код в JSQMessagesInputToolbar.m. Кажется, что inputtoolbar находится в своем собственном окне, вам нужно получить доступ к его окну отдельно.

-(void) didMoveToWindow{
[super didMoveToWindow];
 if (@available(iOS 11.0, *)) {
     [[self bottomAnchor] constraintLessThanOrEqualToSystemSpacingBelowAnchor:self.window.safeAreaLayoutGuide.bottomAnchor multiplier:1.0].active = YES;
     }
}

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

extension JSQMessagesInputToolbar {
    override open func didMoveToWindow() {
        super.didMoveToWindow()
        guard let window = window else { return }
        if #available(iOS 11.0, *) {
            let anchor = window.safeAreaLayoutGuide.bottomAnchor
            bottomAnchor.constraintLessThanOrEqualToSystemSpacingBelow(anchor, multiplier: 1.0).isActive = true
        }
    }
}

Обновил ответ Самсона, потому что он вылетел, когда я покинул экран. Проверяется, чтобы убедиться, что это не ноль перед установкой ограничения.

-(void) didMoveToWindow{
    [super didMoveToWindow];
    if (@available(iOS 11.0, *)) {

        UILayoutGuide *layoutGuide = self.window.safeAreaLayoutGuide;

        if (layoutGuide != nil){
           [[self bottomAnchor] constraintLessThanOrEqualToSystemSpacingBelowAnchor:layoutGuide.bottomAnchor multiplier:1.0].active = YES;
        }

    }
}

Я думаю, что это должен быть лучший способ решить эту проблему, выполнив следующие действия:
1. Откройте JSQMessagesViewController.xib
2. Перетащите нижнее ограничение макета представления коллекции в JSQMessagesViewController.m с именем collectionViewBottomLayoutGuide.
3. Добавьте этот код в конец JSQMessagesViewController.m.

- (void)viewSafeAreaInsetsDidChange {
    [super viewSafeAreaInsetsDidChange];
    self.toolbarBottomLayoutGuide.active = NO;
    self.toolbarBottomLayoutGuide = [NSLayoutConstraint constraintWithItem:self.view.safeAreaLayoutGuide attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.inputToolbar attribute:NSLayoutAttributeBottom multiplier:1.0f constant:0.0f];
    self.toolbarBottomLayoutGuide.active = YES;
    self.collectionViewBottomLayoutGuide.active = NO;
    self.collectionViewBottomLayoutGuide = [NSLayoutConstraint constraintWithItem:self.view.safeAreaLayoutGuide attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.collectionView attribute:NSLayoutAttributeBottom multiplier:1.0f constant:0.0f];
    self.collectionViewBottomLayoutGuide.active = YES;
}

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

Это можно решить лучше, изменив старое ограничение, выполнив следующие шаги:

  1. Откройте JSQMessagesViewController.xib
  2. Нажмите "Инспектор файлов" и выберите "Использовать направляющие для безопасной области".
  3. Изменить цель развертывания JSQMessagesViewController на 9.0
  4. Измените первый элемент нижнего ограничения панели инструментов ввода с Superview на Safe Area и константой на 0
  5. Запустите свой проект.

Незначительное улучшение ответа @J-Bossi для тех из нас, кто не может справиться с техническими нарушениями автопоставки...

Сначала просто удаляет существующее ограничение, а затем добавляет это новое ограничение

extension JSQMessagesInputToolbar {
    override open func didMoveToWindow() {
        super.didMoveToWindow()
        guard let window = window else { return }
        if #available(iOS 11.0, *) {
            guard let constraint = (superview?.constraints.first { $0.secondAnchor == bottomAnchor }) else { return }
            let anchor = window.safeAreaLayoutGuide.bottomAnchor
            NSLayoutConstraint.deactivate([constraint])
            bottomAnchor.constraintLessThanOrEqualToSystemSpacingBelow(anchor, multiplier: 1.0).isActive = true
        }
    }
}
Другие вопросы по тегам