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

时间:2011-06-21 21:36:01

标签: iphone objective-c ios cocoa-touch

我有一个管理UITextView的控制器。通常,在支持多个界面方向的应用程序中,我只需覆盖-shouldAutorotateToInterfaceOrientation:,设置适当的自动调整大小的蒙版,然后继续我的快乐方式。在我喜欢的方式下,如果我开始在肖像模式中编辑这个UITextField,然后将设备旋转到横向,键盘将与横向模式以及视图的其余部分一起很好地制作动画。这就是我要的。

现在,在这个特定的应用程序中,我有一个根视图,只能永远处于纵向模式。这是相机预览视图。我还有一个相机视图的叠加视图,我希望支持所有的界面方向。这是UITextView所在的位置。

因此,作为固定方向根视图的结果,我无法使用内置旋转:我必须手动执行此操作。这不是问题,我可以注册UIDeviceOrientationDidChangeNotification并手动为叠加视图设置适当的旋转和帧调整动画。

这足以让视图正确定位,但键盘仍然只能以纵向显示。再次,每当我收到设备已轮换的通知时,我都可以使用UIApplication -setStatusBarOrientation:来解决这个问题。

但这就是问题出现的地方。我希望结合:

  • 注册轮换通知
  • 手动旋转视图
  • 设置状态栏方向(带动画)

足以完全复制自动旋转行为。但它在一个重要方面不足:如果键盘以一个方向显示,然后旋转到另一个方向,键盘将保持在原始位置,就像从未调用-setStatusBarOrientation:一样。据我所知,影响键盘演示的唯一因素是应用程序的状态栏方向,并且只有一种方法可以设置它。我运气不好吗?是否真的不能像使用自动旋转一样手动操作键盘?

附录
为了避免覆盖旧地,我尝试了以下解决方案黑客:

  • 在方向改变后,辞职并立即再次成为第一响应者。这确实使键盘移动到适当的方向,但它没有动画就会这样做,偶尔会出现非常糟糕的事情,例如在肖像中显示风景大小的键盘,反之亦然。
  • 改变方向时,只需先退出第一响应者。这也有奇怪的行为,即将键盘立即移动(但不调整大小)到新的方向,然后用动画解除它。这是非常丑陋和刺耳的。

2 个答案:

答案 0 :(得分:1)

我们的一个应用程序就是这样做的(因为我们在使用原始设计时没有大声说“不!”)使用疯狂的“方向堆栈”代码。我记得通过在键盘启动时禁用方向来修复此问题(ickyyyy)。

相反,请考虑通过“反向旋转”相机预览视图来支持旋转,而不是强制VC仅限纵向。如果这看起来有点奇怪,你可以做“讨厌的黑客”版本:在VC的视图下添加摄像机预览视图作为窗口的子视图,并为VC的视图提供透明背景。

答案 1 :(得分:0)

也许迟到了。我偶然发现了同样的问题。试图在iOS 6中修复它。

显然苹果同时没有认识到这个问题,否则他们现在就会修复它:除了状态栏以外,-setStatusBarOrientation:方法还包括其他界面元素,或者有替代方法设置键盘和其他元素的方向。遗憾的是他们没有

当键盘启动时禁用方向旋转,对我来说无法解决问题,但我找到了另一个简单的解决方案 hack:

    return NO
  • -(BOOL)shouldAutorotatereturn UIInterfaceOrientationMaskAll
  • -(NSUInteger)supportedInterfaceOrientations
  • 收听设备轮播通知

然后当您收到此类通知时:

  • 隐藏状态栏
  • 键盘启动时,关闭键盘([myTextField resignFirstResponder]
  • 执行手动旋转动画
  • 设置状态栏的方向([sharedApplication setStatusBarOrientation:newOrientation animated:NO]
  • 显示状态栏
  • 如果之前键盘可见,请再次显示([myTextField becomeFirstResponder]

效果是状态栏和键盘在手动旋转动画之前轻轻滑出,并在动画完成后正常滑回。

顺便说一下,我还发现了Corey Floyd写的这篇有趣的文章:http://coreyfloyd.tumblr.com/post/8212203583/2-ways-to-rotate 虽然他的第二种方法:欺骗UIKit,但只会让我更加困惑。