1

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

viewDidAppear只调用一次,这还为时过早,因为当时键盘还没有调整大小。

updateViewConstraints不起作用,因为尚未布置子视图以响应更新的约束。我尝试调用self.view.setNeedsLayout()thenself.view.layoutIfNeeded()以尝试在调用我的函数之前强制进行更新,但这并没有什么不同——它仍然在键盘完成子视图布局之前运行该函数。

我试过viewDidLayoutSubviews了,虽然它是在视图解决后调用的,但问题是这个函数在键盘中滚动集合视图时被调用了一百万次。滚动时我不能调用那个函数,我只能在键盘大小改变并且视图就位后调用它一次。

我考虑过在viewDidAppear延迟后调用它,然后也以轮换方法(例如viewWillTransitionToSize在另一个延迟后)调用它,但这会非常脆弱。我可以增加延迟以使其不那么脆弱,但我想确保尽早调用此方法以确保尽快更新所有内容。

4

1 回答 1

0

根据我在 iOS 8.3 之前解决此问题的经验,对此没有灵丹妙药。我不确切知道您对您正在做的事情的需求,但这里有一些我尝试过的可能解决方案,也许它们会对您有所帮助:

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

第二; 检测您的高度何时UIInputView发生变化,并将该信息传递到您的收藏视图,因此它只会在发生这种情况时重新布局。根据我的经验,这可能只会比必要的多发生两次。

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

无论你做什么,一定要测试当你在为视网膜缩放的应用程序中会发生什么,当用户输入密码字段而你的有状态布局操作正在发生时,如果用户在你关闭键盘时会发生什么重新做事,如果用户关闭键盘并在您的键盘 UI 被释放并因此被回收之前关闭键盘并重新打开它会发生什么(通常当它向上滑动动画而不是弹出时)等等。您最终可能会出现无效状态如果你不小心的话,会搞砸未来的操作,或者一个参考周期和/或你的计时器对你的键盘 UI 的强参考。

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

最后的评论——我自己没有测试过,但有人报告说第三方键盘中的自动布局真的很慢——你似乎暗示你用它来布局视图——我会分析一下确实是您的代码导致了您的问题,我认为您的键盘弹出的时间过长是不可接受的。

我希望这是有帮助的。

于 2015-05-17T23:54:25.150 回答