Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 检测键盘何时完成大小更改以及所有子视图何时定位_Ios_Ios8_Keyboard_Ios App Extension_Ios Keyboard Extension - Fatal编程技术网

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

Ios 检测键盘何时完成大小更改以及所有子视图何时定位,ios,ios8,keyboard,ios-app-extension,ios-keyboard-extension,Ios,Ios8,Keyboard,Ios App Extension,Ios Keyboard Extension,在我的自定义键盘中,我在updateConstraints中添加了一个增加键盘高度的约束。这将导致子视图调整(也使用自动布局)为新尺寸。我需要在布局完成大小调整且所有子视图都已定位后调用一个函数(存储一些新元素的位置以供以后使用,并手动更新一些元素以响应此新布局)。当尺寸改变和元素重新定位时,例如在旋转设备后,需要再次触发此代码。我应该使用什么函数来运行该代码 viewdide只被调用一次,这还为时过早,因为当时键盘的大小还没有调整 updateViewConstraints不起作用,因为子视图

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

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

updateViewConstraints
不起作用,因为子视图尚未根据更新的约束进行布局。我尝试调用
self.view.setNeedsLayout()
然后调用
self.view.layoutifneed()
,试图在调用我的函数之前强制执行更新,但这并没有什么区别-它仍然在键盘完成布局子视图之前运行函数

我尝试了
viewdilayoutsubviews
,虽然它是在视图解决后调用的,但问题是当在键盘上滚动集合视图时,该函数被调用了一百万次。我不能在滚动时调用该函数,我只能在键盘大小改变并且视图固定到位后调用它一次


我考虑过在延迟后在
viewdide
中调用它,然后在另一次延迟后在旋转方法中调用它,例如
viewwilltransitionontosize
,但这将非常脆弱。我可以增加延迟以减少脆弱性,但我希望确保尽早调用此方法,以确保尽快更新所有内容。

根据我在iOS 8.3之前处理此问题时的经验,没有解决此问题的灵丹妙药。我不知道你在做什么时需要什么,但我尝试过一些可能的解决方案,也许它们会对你有所帮助:

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

第二;检测
UIInputView
的高度何时发生变化,并将该信息传递到集合视图,以便仅在发生这种情况时重新显示。根据我的经验,这种情况可能只会比需要多发生两次

第三;检测collectionview何时滚动(您可以注册scrollview的回调),并且在滚动期间不要执行昂贵的布局操作。这也是非常脆弱的

无论你做什么,一定要测试当你在为视网膜应用程序缩放时会发生什么,当用户在进行有状态的布局操作时输入密码字段时会发生什么,如果用户在你做事情时关闭键盘会发生什么,如果用户在解除分配键盘UI之前关闭键盘并重新打开它会发生什么情况,因此会被回收(通常,当它以动画形式向上滑动而不是弹出时),等等。您可能会以无效状态结束,这将破坏未来的操作,或者引用周期和/或计时器对键盘用户界面的强引用(如果不小心)

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

最后一点意见——我自己没有测试过,但有人报告说,第三方键盘中的自动布局速度非常慢——你似乎在暗示你用它来布局视图——我会分析一下,看是不是真的是你的代码导致了你的问题,我认为键盘弹出的时间太长了,令人无法接受

我希望这会有所帮助。

通知不起作用