我在iOS 11模拟器中尝试了JSQMessageViewController
的快速示例。结果如下:screenshot
我尝试过使用安全区域边距并修改工具栏约束,但仍然没有区别。似乎工具栏在UIWindow之外(改为UITextEffectsWindow)。有没有解决方案?
答案 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安全区域内有输入工具栏...... 坏消息是输入工具栏不会显示在非安全区域上,因此图形上不会像默认工具栏一样(见图)
答案 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)