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

4
我有一个控制器来管理UITextView。通常,在支持多个界面方向的应用程序中,我会简单地重写-shouldAutorotateToInterfaceOrientation:,设置适当的自动调整大小掩码,然后继续我的工作。在继续我的工作时,如果我开始编辑这个UITextField,例如,是在纵向模式下,然后将设备旋转到横向模式,键盘会与视图的其余部分一起漂亮地动画到横向模式。这就是我想要的。
现在,在这个特定的应用程序中,我有一个根视图必须永远只能处于纵向模式。这是一个相机预览视图。我还有一个覆盖相机视图的叠加视图,我希望它支持所有的界面方向。这就是UITextView所在的位置。
因此,由于固定方向的根视图,我不能使用内置的旋转:我必须手动完成。这不是问题,我可以注册UIDeviceOrientationDidChangeNotification并手动动画叠加视图的适当旋转和框架调整。
这足以使视图正确定位,但键盘仍然只会以纵向方向显示。同样,每次收到设备旋转的通知时,我都可以通过UIApplication的-setStatusBarOrientation:来纠正这个问题。
但这就是问题所在。我希望以下组合:
- 注册旋转通知 - 手动旋转视图 - 设置状态栏方向(带动画)
足以完全复制自动旋转行为。但它在一个重要的方面表现不佳:如果键盘显示在一个方向上,然后旋转到另一个方向,键盘将固执地保持在原来的位置,好像从未调用-setStatusBarOrientation:一样。据我所知,唯一影响键盘显示的是应用程序的状态栏方向,而且只有一个方法可以设置它。那么我没戏了吗?真的不可能像自动旋转一样手动使键盘旋转吗?
补充说明: 为了避免重复劳动,我尝试了以下解决方案:
- 在方向改变时,放弃并立即重新成为第一响应者。这确实会使键盘移动到适当的方向,但它会在没有动画的情况下这样做,并且偶尔会出现非常糟糕的事情,例如在纵向和横向之间显示横向大小的键盘等。 - 在方向改变时只是放弃第一响应者。这也具有奇怪的行为,即立即将键盘移动(但不调整大小)到新方向,然后以动画方式将其关闭。它非常丑陋和令人震惊。
2个回答

1

我们的一个应用程序使用疯狂的“方向堆栈”代码来实现这一点(因为当最初的设计被提出时,我们没有大声说“不!”)。我记得通过在键盘弹起时禁用方向来解决此问题(恶心)。

相反,考虑通过“反向旋转”相机预览视图来支持旋转,而不是强制将VC限制为仅支持纵向。如果这看起来有点奇怪,您可以使用“肮脏的黑客”版本:将相机预览视图添加为窗口的子视图,在您的VC的视图下方,并给您的VC的视图设置透明背景。


目前我一直在使用一个临时的解决方案,即当键盘弹出时完全禁用旋转。它的好处是实际上能够工作,这似乎是我在这种情况下能做到最好的,尽管它非常“hack”。不幸的是,由于相机预览视图的性质,它必须保持为竖屏状态。甚至倒立的竖屏也不行。感谢确认。 - Matt Wilding

0

可能有点晚了,我也遇到了同样的问题。尝试在iOS 6中修复它。

显然,苹果公司在此期间没有认识到这个问题,否则他们现在应该已经解决了:让 -setStatusBarOrientation: 方法包括除状态栏以外的其他界面元素,或者提供其他方法来设置键盘和其他元素的方向。可惜他们没有这么做。

当键盘弹起时禁用方向旋转对我来说不是解决方案,但我找到了另一个简单的 解决方案 方法:

  • -(BOOL)shouldAutorotate 中返回 NO
  • -(NSUInteger)supportedInterfaceOrientations 中返回 UIInterfaceOrientationMaskAll
  • 监听设备旋转通知

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

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

效果是在手动旋转动画之前,状态栏和键盘会轻松滑出,并在动画完成后优雅地滑回。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接