Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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
Iphone 如何手动旋转键盘(带动画)?_Iphone_Objective C_Ios_Cocoa Touch - Fatal编程技术网

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

Iphone 如何手动旋转键盘(带动画)?,iphone,objective-c,ios,cocoa-touch,Iphone,Objective C,Ios,Cocoa Touch,我有一个管理UITextView的控制器。通常,在一个支持多种界面方向的应用程序中,我只需覆盖-shouldAutorotateToInterfaceOrientation:,设置适当的自动调整大小掩码,然后继续我的工作。沿着我的快乐之路,如果我开始在(比如)纵向模式下编辑这个UITextField,然后将设备旋转到横向方向,键盘将与视图的其余部分一起很好地设置为横向模式。这就是我想要的 现在,在这个特定的应用程序中,我有一个根视图,它必须永远处于纵向模式。这是一个相机预览视图。我也有一个覆盖视

我有一个管理UITextView的控制器。通常,在一个支持多种界面方向的应用程序中,我只需覆盖
-shouldAutorotateToInterfaceOrientation:
,设置适当的自动调整大小掩码,然后继续我的工作。沿着我的快乐之路,如果我开始在(比如)纵向模式下编辑这个UITextField,然后将设备旋转到横向方向,键盘将与视图的其余部分一起很好地设置为横向模式。这就是我想要的

现在,在这个特定的应用程序中,我有一个根视图,它必须永远处于纵向模式。这是一个相机预览视图。我也有一个覆盖视图的相机视图,我想有支持所有接口方向。这是UITextView所在的位置

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

这足以正确定位视图,但键盘仍然只能以纵向显示。同样,每次收到设备已旋转的通知时,我都可以使用UIApplication的
-setStatusBaroOrientation:
来更正此问题

但这就是问题所在。我希望:

  • 注册轮换通知
  • 手动旋转视图
  • 设置状态栏方向(带动画)
足够精确地复制自动旋转行为。但它在一个重要方面存在缺陷:如果键盘以一个方向显示,然后旋转到另一个方向,键盘将毫无顾忌地保持在原始位置,就好像从未调用过
-setStatusBarOrientation:
。据我所知,影响键盘显示的唯一因素是应用程序的状态栏方向,设置它的方法只有一种。那么我是不是运气不好?是否真的不可能像自动旋转一样,用视图手动旋转键盘

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

  • 一旦方向改变,辞职并立即再次成为第一响应者。这确实会使键盘移动到适当的方向,但它在没有动画的情况下移动,有时还会做一些非常糟糕的事情,例如在纵向显示横向大小的键盘,反之亦然
  • 一旦方向改变,请立即辞职。这还有一个奇怪的行为,即立即将键盘移动(但不调整大小)到新方向,然后用动画将其取消。这是非常丑陋和刺耳的
我们的一个应用程序使用疯狂的“方向堆栈”代码来实现这一点(因为我们在展示原始设计时没有大声说“不!”)。我记得我在键盘打开时禁用了方向功能(ickyyyy),解决了这个问题


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

可能会迟到。我偶然发现了同样的问题。尝试在iOS 6中修复它

显然,苹果当时没有意识到这个问题,否则他们现在就已经解决了:让
-setStatusBarOrientation:
方法包括除状态栏之外的其他界面元素,或者有其他方法来设置键盘和其他元素的方向。可惜他们没有

键盘打开时禁用方向旋转对我来说不是解决方案,但我发现了另一个简单的解决方案:

  • 中的
    返回否
    -(BOOL)应自动旋转
  • -(NSUInteger)支持的接口方向中返回UIInterfaceOrientationMaskAll
  • 侦听设备旋转通知
当您收到此类通知时:

  • 隐藏状态栏
  • 键盘打开时,关闭键盘(
    [myTextField resignFirstResponder]
  • 执行手动旋转动画
  • 设置状态栏的方向(
    [sharedApplication setStatusBarOrientation:newOrientation:否]
  • 显示状态栏
  • 如果之前键盘可见,请再次显示(
    [myTextField becomeFirstResponder]
其效果是,状态栏和键盘在手动旋转动画之前轻轻滑出,在动画完成后优雅地滑回

顺便说一句,我还发现了Corey Floyd的这篇有趣的文章:
尽管他的第二种方法:欺骗UIKit,只会让我更加困惑。

在键盘打开时完全禁用旋转是我目前使用的占位符解决方案。它有实际工作的好处,这是我在这种情况下所能做的最好的事情,尽管这是相当困难的。不幸的是,由于相机预览视图的性质,它必须保持纵向。即使是正面朝下的肖像也不好。谢谢你的确认。