如何手动旋转键盘(带动画)?

我有一个管理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,但只会让我更加困惑。