jsqmessageviewcontroller ios11工具栏

我已经尝试了iOS 11模拟器里面的JSQMessageViewController的swift例子。 这是结果: 截图

我已经尝试使用安全区域边距并修改工具栏约束,但仍然没有区别。 看来,工具栏是UIWindow之外(改为UITextEffectsWindow)。 有没有解决办法?

这个答案是基于JSQMessagesViewController版本7.3。

注:下面的代码包含一些杂乱的编译指示,以避免编译器警告。 代码本身实际上很简单,只要你看到的是编译以外的东西。

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

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

编辑:对于Swift用户,下面的技巧应该让你调用私人objc方法:

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

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

 #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wundeclared-selector" [self performSelector:@selector(jsq_updateCollectionViewInsets)]; #pragma clang diagnostic pop 

我有同样的问题。 我试图解决它通过添加JSQMessageViewController作为一个ViewController的子视图安全区域设置。

作为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] ]]; } 

不理想的解决scheme,但至less你会有input工具栏内iOS11的安全区域…坏消息是,input工具栏不会显示在非安全区域,所以graphics不会像默认的工具栏(见图片)

在这里输入图像说明

我已经明白了! 只要把下面的代码放在JSQMessagesInputToolbar.m中。 似乎inputtoolbar被放置在它自己的窗口中,您需要单独访问它的窗口。

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

我build议基于JSQ最新develop分支提交一个固定的叉子。

它使用了didMoveToWindow解决scheme。 不理想,但值得尝试,而等待苹果的答案关于inputAccessoryView的安全区域布局指南附件,或任何其他更好的修复。

您可以将其添加到您的Podfile,replace以前的JSQ行:

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