无法在 iOS8 自定义键盘中获得约束

Posted

技术标签:

【中文标题】无法在 iOS8 自定义键盘中获得约束【英文标题】:Can't get constraints right in iOS8 custom keyboard 【发布时间】:2014-11-30 20:14:23 【问题描述】:

我在 ios 8 中的自动布局方面遇到了重大问题。我正在使用自定义键盘,但我无法让视图以正确的高度显示。设备上的渲染视图太低,更像是 UIImageView 的预期高度。如图所示,我已经设置了约束:

但我在日志中不断收到此错误,这并没有告诉我任何信息(可能是因为我不知道在哪里查看):

2014-12-06 19:56:45.095 [40268:12181198] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this:(1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x600000096940 V:[UIInputView:0x7fe780d3f600(246)]>",
    "<NSLayoutConstraint:0x600000097390 'UIView-Encapsulated-Layout-Height' V:[UIInputView:0x7fe780d3f600(0)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600000096940 V:[UIInputView:0x7fe780d3f600(246)]>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

我已尝试按照iOS 8 Custom Keyboard: Changing the Height 中的代码进行操作,但仍然无法正常工作。

编辑:

我正在使用以下函数设置我的高度限制:

override func updateViewConstraints() 
    super.updateViewConstraints()
    // Add custom view sizing constraints here
    let changeToOrientation = deviceInfoService.getOrientationForView(self.inputView)

    if (changeToOrientation == Orientation.Portrait) 
        self._heightConstraint!.constant = 246
        self.inputView.addConstraint(self._heightConstraint!)
     else 
        self._heightConstraint!.constant = 192
        self.inputView.addConstraint(self._heightConstraint!)
    

【问题讨论】:

你能把剩下的日志也加进去吗?特别是前面提到的关于translatesAutoresizingMaskIntoConstraints 的部分。 使用 AutoLayout 时你一般不想设置.translatesAutoresizingMaskIntoConstraints = no 我已经添加了日志的缺失部分。 【参考方案1】:

这看起来像是 iOS 自定义键盘实现中的一个错误。目前的解决方法是将约束的优先级调整为大于/小于 1000

【讨论】:

将“my”约束的优先级设置为 999 会删除日志中的错误。然而高度仍然正确 - 所以我想它正在工作。 所以选择我的答案:)【参考方案2】:

该错误告诉您存在冲突的约束。 UIView-Encapsulated-Layout-Height 似乎是一个预定义的高度(在搜索时,我主要在 UICollectionView 中找到了对其用法的引用)。我的猜测是,它是操作系统定义的键盘允许的高度。另一个约束很可能是您创建的视图的内在内容大小(316 和 30 确实加起来为 246)。

我的结论是,当你改变高度时,你可能做错了什么。由于我对键盘扩展开发不太熟悉,所以我不能告诉你什么。但是,当涉及到我使用过的 Today Extensions 时,有一种方法可以覆盖,它指定了小部件的高度。

【讨论】:

应用程序扩展编程指南说:“您可以使用自动布局调整自定义键盘主视图的高度。默认情况下,自定义键盘的大小与系统键盘匹配,根据屏幕大小和设备方向。自定义键盘的宽度始终由系统设置为等于当前屏幕宽度。要调整自定义键盘的高度,请更改其主视图的高度约束。在 iOS 8.0 中,您可以在主视图之后随时调整自定义键盘的高度视图最初在屏幕上绘制。”这就是我认为我正在做的事情。 :) 但据我所知,您对UIInputView 没有高度限制,仅在其子视图上。如果你添加它,它会工作吗? 我在代码中为输入视图设置了高度约束——如我的编辑所示。由于某种原因,我无法在 IB 中的输入视图上设置高度限制。 我明白了。您确定该方法会被调用吗? 似乎是 - 如果我在其中放置一个断点,它将在 kb 启动时被触发。单步执行这个函数,它似乎做了它应该做的事情。【参考方案3】:

这看起来类似于提供 TodayExtension 高度的方式。试试这个:

self.preferredContentSize = CGSizeMake(320, 246);

这就是我设置今天扩展的高度与明确设置高度限制的方式。我会自己尝试一下,现在只是组合一个示例键盘项目。

【讨论】:

你发现了什么?

以上是关于无法在 iOS8 自定义键盘中获得约束的主要内容,如果未能解决你的问题,请参考以下文章

无法启用 iOS8 自定义键盘

iOS8 自定义键盘问题

自定义键盘应用程序扩展 iOS 8 上的 Siri

如何在iOS8自定义键盘中使用自动更正和快捷列表?

设备上的 iOS 8 自定义键盘

iOS8 自定义键盘 Settings.bundle 不显示