jsqmessagesviewcontroller inputToolBar IOS 11 iphone X Swift4

jsqmessagesviewcontroller inputToolBar IOS 11 iphone X Swift4

我知道这个库已经被弃用了,但是有人解决了 inputToolBar 和 iPhone X 的问题吗?目前,inputToolBar 部分 covered.Check 在附加图像之外。

提前致谢

伙计们,我是问这个问题的人 ,我已经弄明白了!

只需将以下代码放在JSQMessagesInputToolbar.m中即可。好像inputtoolbar是放在自己的window里面的,需要单独访问它的window

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

更新了 Samson 的回答,因为当我离开屏幕时它会崩溃。在设置约束之前检查以确保它不是零。

-(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;
        }

    }
}

如果您不想更改 pod 中的代码并使用更像 swifty 的扩展,您可以使用以下代码:

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
        }
    }
}

添加新约束并保留旧约束,这将导致在 xcode 调试屏幕中看到布局错误,并且 xcode 将打破其中一个约束以满足布局。即使您在屏幕上看到正确的布局,您也可能会遇到不同的问题,例如不响应键盘更改。

通过以下步骤更改旧约束可以更好地解决此问题:

  1. 打开JSQMessagesViewController.xib
  2. 单击文件检查器并选择 "Use safe area layout guides"
  3. 将 JSQMessagesViewController 的部署目标更改为 9.0
  4. 将输入工具栏底部约束的第一项从超级视图更改为安全区域并将常量更改为 0
  5. 运行 你的项目。

我认为这应该是通过以下步骤解决此问题的更好方法:
1.打开JSQMessagesViewController.xib
2. 将集合视图的底部布局约束向下拖动到名为 collectionViewBottomLayoutGuide 的JSQMessagesViewController.m。
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;
}

@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 { [=10=].secondAnchor == bottomAnchor }) else { return }
            let anchor = window.safeAreaLayoutGuide.bottomAnchor
            NSLayoutConstraint.deactivate([constraint])
            bottomAnchor.constraintLessThanOrEqualToSystemSpacingBelow(anchor, multiplier: 1.0).isActive = true
        }
    }
}