繁体   English   中英

检测键盘何时完成大小更改以及所有子视图的位置

[英]Detect when keyboard has finished changing size and all subviews are positioned

在我的自定义键盘中,我在updateConstraints中添加了一个约束,该约束增加了键盘的高度。 这将导致子视图调整(也使用“自动布局”)为新大小。 当布局完成调整其大小并且所有子视图都已定位后,我需要调用一个函数(以存储稍后要使用的一些新元素的位置,并响应此新布局手动更新某些元素)。 当尺寸改变并且元素重新定位时,例如在旋转设备之后,需要再次触发该代码。 我应该使用什么功能来运行该代码?

viewDidAppear仅被调用一次,这还为时过早,因为当时键盘的大小尚未调整。

updateViewConstraints不起作用,因为尚未针对更新的约束updateViewConstraints视图进行布局。 我试着打电话self.view.setNeedsLayout()然后self.view.layoutIfNeeded()企图迫使更新打电话给我的函数之前进行,但这并没有发挥作用-它仍然运行功能键盘完成之前布置子视图。

我尝试过viewDidLayoutSubviews ,虽然它在视图建立之后被调用,但问题是在键盘上滚动集合视图时,该函数被调用了百万次。 滚动时无法调用该函数,只能在键盘大小改变并且视图固定到位后一次调用它。

我考虑过在延迟后在viewDidAppear调用它,然后又在另一个延迟后在诸如viewWillTransitionToSize的旋转方法中调用它,但这将非常脆弱。 我可以增加延迟以减少它的脆弱性,但我想确保尽早调用此方法,以确保尽快更新所有内容。

根据我在iOS 8.3之前的版本中解决此问题的经验,这没有灵丹妙药。 我不确定您对所做的事情有什么确切的要求,但是我尝试了以下几种可能的解决方案,也许它们会对您有所帮助:

第一; 假设您的键盘最终将更新为您的“所需”大小,并根据viewDidLayoutSubviews布局进行布局。 您进行一次布局调整大小,然后再也不进行调整,除非您检测到方向已更改。 这样做的缺点是:a)在更新高度限制之前的时间内,您的键盘只会部分显示在屏幕上; b)在某些情况下,高度限制将不被遵守,并且您会留下变形的键盘(您可以使用计时器解决此问题,但正如您观察到的那样,它非常脆弱),并且c)在iPhone 6/6 +上的“按比例缩放视网膜”应用程序中,很难使其正常工作。

第二; 检测UIInputView的高度UIInputView更改,并将该信息传递给您的集合视图,这样它只会在发生这种情况时重新布局。 以我的经验,这种情况可能只会发生两次,而不是必要的次数。

第三; 检测collectionview何时滚动(您可以从scrollview注册回调),并且在发生这种情况时不要进行昂贵的布局操作。 这也很脆弱。

无论您做什么,都一定要测试一下在按比例缩放视网膜应用程序时发生的情况,当用户在有状态的布局操作发生时输入密码字段时,如果用户在您进行缩放操作时关闭键盘会发生什么情况在执行此操作时,如果用户在释放键盘UI并因此将其回收(通常以动画形式滑动而不是弹出)循环之前关闭用户键盘并重新打开它,会发生什么情况。您可能会得到无效状态,该状态将如果不小心,可能会破坏将来的操作,或者破坏计时器的参考周期和/或强烈引用您的键盘UI。

同样,在存储元素位置的情况下,我不知道您在做什么,但是直接读取这些属性可能比存储它们更好。 状态越多,潜在的问题就越多。

最后的评论-我自己还没有测试过,但是有人报告说第三方键盘中的自动布局速度很慢-您似乎暗示要使用它来布局视图-我会分析一下是否确实是由您的代码引起的问题,我认为这会导致您的键盘弹出时间过长。

我希望这是有帮助的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM