如何手动旋转键盘(带动画)?
我有一个管理UITextView的控制器。 通常,在支持多个界面方向的应用程序中,我只需覆盖-shouldAutorotateToInterfaceOrientation:
,设置适当的自动resize的蒙版,并以我的快乐方式继续。 顺着我的快乐方式,如果我开始在肖像模式中编辑这个UITextField,然后将设备旋转到横向,键盘将与横向模式以及视图的其余部分一起很好地制作动画。 这就是我要的。
现在,在这个特定的应用程序中,我有一个只能处于纵向模式的根视图。 这是相机预览视图。 我还有一个相机视图的叠加视图,我希望支持所有的界面方向。 这是UITextView所在的位置。
因此,作为固定方向根视图的结果,我不能使用内置旋转:我必须手动执行此操作。 这不是问题,我可以注册UIDeviceOrientationDidChangeNotification
并手动为叠加视图设置适当的旋转和帧调整动画。
这足以让视图正确定位,但键盘仍然只能以纵向显示。 同样,我可以使用UIApplication的-setStatusBarOrientation:
来纠正这个-setStatusBarOrientation:
每当我收到设备已旋转的通知时。
但这就是问题出现的地方。 我希望结合:
- 注册轮换通知
- 手动旋转视图
- 设置状态栏方向(带动画)
足以完全复制自动旋转行为。 但它在一个重要方面不足:如果键盘以一个方向显示,然后旋转到另一个方向,键盘将保持在原始位置,就好像-setStatusBarOrientation:
从未被调用过一样。 据我所知,影响键盘演示的唯一因素是应用程序的状态栏方向,并且只有一种方法可以设置它。 我运气不好吗? 是否真的不可能像使用自动旋转那样手动操作键盘?
附录
为了避免覆盖旧地,我尝试了以下解决方案 :
- 方向改变后,辞职并立即再次成为第一响应者。 这确实使键盘移动到适当的方向,但它没有动画就这样做了,偶尔会做一些非常糟糕的事情,例如在肖像中显示风景大小的键盘,反之亦然。
- 在方向改变时,只需辞职第一响应者。 这也有奇怪的行为,即将键盘立即移动(但不resize)到新的方向,然后用动画解除它。 这非常丑陋且不和谐。
我们的一个应用程序就是这样做的(因为我们在使用原始设计时没有大声说“不!”)使用疯狂的“定向堆栈”代码。 我记得通过在键盘启动时禁用方向来修复此问题(ickyyyy)。
相反,请考虑通过“反向旋转”相机预览视图来支持旋转,而不是强制VC仅限纵向。 如果这看起来有点奇怪,你可以做“讨厌的黑客”版本:在VC的视图下添加摄像机预览视图作为窗口的子视图,并为VC的视图提供透明背景。
也许迟到了。 我偶然发现了同样的问题。 试图在iOS 6中修复它。
显然Apple同时没有认识到这个问题,否则他们现在就修复它了:让-setStatusBarOrientation:
方法除了状态栏之外还包括其他界面元素,或者有替代方法来设置方向键盘和其他元素。 可惜他们没有
键盘启动时禁用方向旋转,对我来说无法解决问题,但我找到了另一个简单的解决方案 :
-
return NO
-(BOOL)shouldAutorotate
-
return UIInterfaceOrientationMaskAll
in-(NSUInteger)supportedInterfaceOrientations
- 听设备轮换通知
然后,当您收到此类通知时:
- 隐藏状态栏
- 当键盘启动时,关闭键盘(
[myTextField resignFirstResponder]
) - 执行手动旋转动画
- 设置状态栏的方向(
[sharedApplication setStatusBarOrientation:newOrientation animated:NO]
) - 显示状态栏
- 如果之前键盘可见,再次出现(
[myTextField becomeFirstResponder]
)
结果是状态栏和键盘在手动旋转动画之前轻轻滑出,并在动画完成后正常滑回。
顺便说一句,我也发现了Corey Floyd写的这篇有趣的文章: http ://coreyfloyd.tumblr.com/post/8212203583/2-ways-to-rotate虽然他的第二种方法:欺骗UIKit,但只会让我更加困惑。