jsqmessageviewcontroller ios11工具栏

时间:2017-09-27 05:17:05

标签: ios uitoolbar ios11 jsqmessagesviewcontroller

我在iOS 11模拟器中尝试了JSQMessageViewController的快速示例。结果如下:screenshot

我尝试过使用安全区域边距并修改工具栏约束,但仍然没有区别。似乎工具栏在UIWindow之外(改为UITextEffectsWindow)。有没有解决方案?

8 个答案:

答案 0 :(得分:7)

只需为JSQMessagesInputToolbar添加扩展名

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

答案 1 :(得分:4)

伙计们我已经弄明白了!只需将以下代码放在JSQMessagesInputToolbar.m中即可。似乎inputtoolbar放在它自己的窗口中,你需要单独访问它的窗口。

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

答案 2 :(得分:3)

此答案基于JSQMessagesViewController版本7.3。

注意:下面的代码包含一些凌乱的pragma指令,以避免编译器警告。一旦你超越了pragma,代码本身就非常简单了。

这似乎解决了这个问题,同时仍然允许在显示软件键盘时移动工具栏。我在JSQMessagesViewController子类中添加了以下代码:

var cookie = request.cookie(app.session.sessionName + '=' + app.session.sessionId);

progress(request(url), {
    header: {
        'Cookie': cookie
    }
})

// Access denied [Anonymous user]

编辑对于Swift用户,以下技巧可让您调用私有objc方法:

- (void)viewDidLoad {
    [...]

    // To keep the toolbar inside the safe area on iPhone X, we need to install a new constraint that has higher priority than the one
    // JSQMessagesViewController manipulates when adjusting for the keyboard. The `toolbarBottomLayoutGuide` is a private property in our
    // superclass, so it's not straightforward to access it...
    if (@available(iOS 11.0, *)) {
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wundeclared-selector"
        NSLayoutConstraint *constraint = [self performSelector:@selector(toolbarBottomLayoutGuide)];
    #pragma clang diagnostic pop
        constraint.priority = 999;
        [self.inputToolbar.bottomAnchor constraintLessThanOrEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor].active = YES;
}

编辑:添加此新约束后,不会调用调整collectionView的contentInset的代码,因此,如果聊天视图包含的消息多于适合屏幕的消息,则最后的消息气泡会被遮挡通过输入工具栏。我通过在 viewDidAppear viewDidLayoutSubviews中添加以下代码来确保更新插件来解决这个问题:

let constraint = perform(Selector(("toolbarBottomLayoutGuide"))).takeUnretainedValue() as! NSLayoutConstraint
constraint.priority = 999

答案 3 :(得分:3)

我提出了一个基于JSQ最新develop分支提交的固定分支。

正在使用didMoveToWindow解决方案。在等待Apple关于inputAccessoryView的安全区域布局指南附件或任何其他更好的解决方案的答案时,不太理想但值得尝试。

您可以将其添加到Podfile中,替换以前的JSQ行:

pod 'JSQMessagesViewController', :git => 'https://github.com/Tulleb/JSQMessagesViewController.git', :branch => 'develop', :inhibit_warnings => true

答案 4 :(得分:2)

我有同样的问题。我试图通过在具有安全区域设置的viewController上添加JSQMessageViewController作为子视图来解决它。

成为MyJSQMessageViewController JSQMessagesViewController的子类:

self.myJSQMessageViewController = [[MyJSQMessageViewController alloc] init];
[self addChildViewController:self.myJSQMessageViewController];
[self.view addSubview:self.myJSQMessageViewController.view];
[self.myJSQMessageViewController didMoveToParentViewController:self];
if (@available(iOS 11.0, *)) {
    self.myJSQMessageViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
    [NSLayoutConstraint activateConstraints:@[ [self.myJSQMessageViewController.view.leadingAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.leadingAnchor], [self.myJSQMessageViewController.view.trailingAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor], [self.myJSQMessageViewController.view.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor], [self.myJSQMessageViewController.view.bottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor] ]];
}

不理想的解决方案,但至少你会在iOS11安全区域内有输入工具栏...... 坏消息是输入工具栏不会显示在非安全区域上,因此图形上不会像默认工具栏一样(见图)

enter image description here

答案 5 :(得分:2)

在iPhoneX的输入工具栏下面找到一个没有空白区域的解决方案,不是整个工具栏it.nextView.visibility = View.INVISIBLE Glide.with(...) .load(url) .listener(object : RequestListener<Drawable> { override fun onLoadFailed( e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean ): Boolean { return false } override fun onResourceReady( resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean ): Boolean { it.setImageDrawable(resource) return true } }) .into(it.nextView as ImageView) 应该在安全区域之上,而只是在self

self.contentView

答案 6 :(得分:0)

选中此response

哪个州

  • 创建JSQMessagesInputToolbar类的接口,并且
  • 重写didMoveToWindow方法以添加以下代码:

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

注意:创建界面优先于更改类。因为如果您使用可可豆荚,那么每次更新豆荚时,您的更改都会被覆盖。

我已经使用iPhone XR(模拟器)和iPhone 7(设备)对其进行了检查。

答案 7 :(得分:0)

对于即使在应用leave()修复后工具栏仍存在问题的任何人,这可能是由于 IQKeyboardManager 造成的。

使用IQKeyboardManager时,向下滚动(隐藏键盘)或点击“简介”时遇到了一些问题,因此最好为聊天所在的特定ViewController禁用它。这样,在底部就不会有不希望的利润。

Bottom padding on JSQMessagesViewController toolbar