在我的自定义键盘中,我在updateConstraints
中添加了一个增加键盘高度的约束。这会导致子视图(也使用自动布局)调整为新大小。我需要在布局调整完大小并调整所有子视图时调用一个函数(以存储稍后要使用的一些新元素的位置,并手动更新一些元素以响应这个新布局)。当大小已更改并且元素重新定位时,例如在旋转设备之后,需要再次触发此代码。我应该用什么函数来运行该代码?
viewDidAppear
只会被调用一次,而且由于当时键盘的大小没有调整,所以太早了。
updateViewConstraints
无法正常工作,因为尚未针对更新的约束布置子视图。我试着调用self.view.setNeedsLayout()
然后调用self.view.layoutIfNeeded()
以试图在调用我的函数之前强制更新,但这并没有什么区别 - 它仍然在键盘完成布局之前运行该函数子视图。
我尝试viewDidLayoutSubviews
并且在视图结算后调用它时,问题是在键盘中滚动集合视图时,此函数被调用了一百万次。我无法在滚动时调用该函数,我只能在键盘大小发生变化并且视图已定位到位后再调用一次。
我考虑过在延迟之后在viewDidAppear
中调用它,然后在另一个延迟之后也在viewWillTransitionToSize
之类的旋转方法中调用它,但这将非常脆弱。我可以增加延迟,使其不那么脆弱,但我想确保尽早调用此方法,以确保尽快更新所有内容。
答案 0 :(得分:0)
根据我在iOS 8.3之前处理此问题的经验,没有银子弹。我不确切地知道你对你正在做什么的需求是什么,但是我已经尝试了许多可能的解决方案,也许它们会对你有所帮助:
首先;假设您的键盘最终会更新为“所需”尺寸,并根据viewDidLayoutSubviews
中的布局执行布局。您执行一次调整大小的布局,然后再也不会再次执行此操作,除非您检测到您已更改方向。这有一个缺点:a)在你的高度约束更新之前的时间,你的键盘只会部分出现在屏幕上,b)在某些情况下,高度约束将不会被尊重,你将留下一个畸形键盘(你可以通过计时器来解决这个问题,但正如你观察到它非常脆弱),以及c)在iPhone 6/6 +上的“scaled-for-retina”应用程序中很难正常工作。
二;检测UIInputView
的高度何时发生变化,并将该信息传递到您的集合视图,因此只有在发生这种情况时才会重新启动。根据我的经验,这可能只会发生两次以上。
第三;检测集合视图何时滚动(您可以从scrollview注册回调),并且在发生这种情况时不要执行昂贵的布局操作。这也很脆弱。
无论你做什么,一定要测试当你处于视网膜缩放应用程序时会发生什么,当用户在你的布局操作正在发生状态时输入密码字段时,如果用户关闭键盘会发生什么当你正在做事时,如果用户关闭键盘并在键盘UI被解除分配之前重新打开键盘并因此被回收(当它滑动动画而不是弹出时,通常)等等,会发生什么情况。等等你可能最终会出现无效状态如果你不小心的话,这会搞砸你未来的操作,或参考周期和/或对你的键盘用户界面的强烈参考。
在存储元素位置的情况下,我不知道你在做什么,但是直接读取这些属性可能比存储它们更好。更多的州是更多的潜在问题。
最终评论 - 我自己没有对此进行过测试,但是有些人报告说第三方键盘中的自动布局非常慢 - 你似乎暗示你用它来布局视图 - 我会说看看你的代码是否真的导致了你的问题,我认为你的键盘弹出的时间长得令人无法接受。
我希望这有用。