ios - iOS 自定义键盘高度启动故障
问题描述
我创建了一个自定义键盘,它工作正常。我将高度约束设置为与默认键盘相同。问题是,当键盘首次启动时,它从键盘下方开始,然后将自身定位到正确的高度。
有谁知道为什么会这样?
我附上了发射时和发射后的两张照片:
我正在对视图高度进行硬编码。
override func viewDidLayoutSubviews() {
if UIScreen.main.bounds.width < UIScreen.main.bounds.height {
if UIScreen.main.bounds.height == 667 ||
UIScreen.main.bounds.height == 812 {
viewHeight.constant = 216
} else {
viewHeight.constant = 226
}
} else if UIScreen.main.bounds.width > UIScreen.main.bounds.height {
if (UIScreen.main.bounds.height == 375 && UIScreen.main.bounds.width == 667) || UIScreen.main.bounds.height == 812 || (UIScreen.main.bounds.height == 414 && UIScreen.main.bounds.width == 736) {
viewHeight.constant = 158
} else {
viewHeight.constant = 168
}
}
}
解决方案
没有看到你的代码很难说。
如果我理解正确:
- 您将高度约束设置为与默认键盘相同
- 首次启动时键盘显示不正确
- 在后续启动时,键盘会正确显示
这可能有两个原因:
1) 在首次启动时设置高度限制时,您设置的值与您在后续启动时看到的值不同。验证您在首次启动时为高度约束设置的值是否与您在后续启动时设置的值以及高度约束在后续启动时有效的值相同。您可以通过检查布局和/或记录高度约束值来做到这一点。
2)当您在首次启动时为高度约束设置的值与您在后续启动时设置的值相同并且约束有效具有相同的值,但仍然显示不同,则可能是布局问题。验证您是否在布局过程的正确位置设置了高度约束的值,您正确地通知布局引擎该值已更改,并且布局引擎有足够的时间来呈现更改而不会被中断。
一般方法:
消除复杂性,直到您的代码变得如此简单以至于您有更好的机会解决问题。对于调试,而不是嵌套
if
的 s 将高度设置为固定值,并查看布局是否在每次启动时仍然发生变化。尝试您在网上找到的其他自定义键盘项目,看看它们是否表现出类似的行为,也许这会给您一个提示。
确保您了解 iOS 自动布局的工作原理,并在必要时进行研究。这可能是一个相当复杂的话题。您问题中的代码只说明了这么多,但对于自动布局、视图层次结构以及您何时/何地影响代码其他部分的布局过程是重要的方面。没有看到整个视图和代码结构,这个问题很难分析。
尽可能简化您的项目,并在 Github 上提供您可以在此处参考的演示,以便其他人可以重现该问题。
推荐阅读
- java - MapStruct + Kotlin/JVM(v1.5.10) 错误:返回类型 Flow
是一个抽象类或接口 - node.js - Nodemailer 无法向 Outlook 地址发送电子邮件
- python-2.7 - 使用 gitbash 工具的 GKE 集群
- typescript - 无法在 vscode 中安装 tsconfig json
- netbeans - NetBeans 输出控制台:“行太长,请切换到包装模式以查看整行”。解决错误
- python - AttributeError:部分初始化的模块“matplotlib”没有属性“__version_”(很可能是由于循环导入)
- mysql - 如何使用 node.js 连接到远程 linux 机器中的 mysql db
- python - 每个键具有多个值的字典列表作为数据框
- php - 使用 streamWrapper 时的 SplFileInfo::getRealPath()
- python - 在音频keras tensorflow中获取所有分类的类标签