【问题标题】:How do I make sure my view is oriented properly after full screen video?在全屏视频后,如何确保我的视图方向正确?
【发布时间】:2012-04-07 18:23:45
【问题描述】:

我有一个通用的 ipad/iphone 应用程序,它允许用户观看视频,然后他们可以将其扩展到全屏模式。

我已经实现了(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration,在该方法中,我根据视图元素是横向还是纵向对视图元素执行各种 setFrame 调用。

这一切在正常使用中似乎都可以正常使用,即来回旋转也可以正常使用。

但是,如果用户以纵向模式开始,开始播放视频,进入全屏模式,变成横向,然后视频停止 - 元素通常没有正确调整大小。它们的大小似乎仍然像纵向模式一样。

如果我转为纵向模式,然后再转回横向,则视图会正确重置。

奇怪的是,我已经实现了(void)exitedFullscreen:(NSNotification*)notification 并在其中打印出方向,并且可以正确看到。我还调用我的代码来根据当前方向重置视图元素,但我仍然遇到这个问题。

另一个相关问题是有时在处理旋转时,我的视图最终会在屏幕上太远,实际上位于设备顶部的状态栏下方。

编辑这是最新的例子。我在全屏视频播放期间旋转到横向模式,然后当我离开全屏视频时,您可以在视图顶部看到导航栏的问题。

【问题讨论】:

    标签: ios ios5 orientation


    【解决方案1】:

    解决此问题的一种可能方法是通过模态显示视图控制器而不是使用导航视图控制器。

    请参阅肯尼在Problem pushViewController from Landscape to Portrait的回答

    【讨论】:

      【解决方案2】:

      您的 ViewController 可能不会旋转,因为另一个控制器是第一响应者。为了避免这种情况,您可以采取措施将视图控制器注册到设备旋转更改中,并在收到此类通知时在您调用的选择器中实现旋转。

      在 appDelegate 中:

          [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
      

      在您的视图控制器中

          [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:)name:UIDeviceOrientationDidChangeNotification object:nil]; 
      

      在确实旋转时,您可以检查方向

          [[UIDevice currentDevice] orientation]
      

      【讨论】:

      • 这有助于解决我的视频内联播放时的旋转问题,但当视频全屏、旋转并退出全屏时,我仍然遇到问题。有关问题的示例,请参阅我的最新编辑以及随附的屏幕截图。
      • 我将奖励您答案/赏金,因为似乎自从我做出了您的更改后,方向问题肯定得到了改善。我认为我唯一剩下的问题与退出全屏后导航栏位于状态栏下方有关,这可能是完全不同的问题。
      【解决方案3】:

      视图顶部的导航栏。我用这段代码解决了它->

      [[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];
      [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES];
      

      在轮换后使用它。

      【讨论】:

      • 感谢您的回复。我尝试在旋转后使用此代码,在我将元素定位在视图上以获取新方向的代码部分之后,它似乎没有任何效果。
      【解决方案4】:

      Mason,您是否登录并检查过您的方法 willAnimateRotationToInterfaceOrientation:duration: 在每次状态转换后是否被调用?

      【讨论】:

      • 是的,它确实被调用了。正如您在我的问题中看到的那样,就轮换而言,事情大部分都在起作用。在电影播放期间发生旋转时,它似乎主要有问题。有时即使不是全屏。
      • 所以你说你的方法甚至在问题出现之前就被调用了,但是由于该方法检索了不正确的方向值“......对你的视图的各种 setFrame 调用”被错误的输入所欺骗?跨度>
      • 我已经进行了一些调试来记录报告的方向,这似乎从来都不是问题。当我收到旋转通知时,始终会正确报告方向。
      【解决方案5】:

      对我来说,这个最新的屏幕截图看起来不像是方向改变问题。 导航栏基本上被状态栏的高度关闭了。

      您的位置计算可能失败,因为您正在使用视图的框架 在播放全屏视频(不带状态栏)时,一旦失败 状态栏又回来了?

      【讨论】:

      • 感谢您的回复。我用一些断点测试了你关于时间问题的理论。调整位置计算的代码肯定是在它具有全屏视频模式之后发生的。
      【解决方案6】:

      如果有另一个控制器充当第一响应者,您的方向可能无法正确更新。克服这个问题的最好方法是使用视图控制器的当前方向在方法viewWillAppear: 处调用用于定位屏幕的函数:[self interfaceOrientation]

      如果您使用子类子视图,您可能需要重新实现方法 layoutSubviews 并调用 setNeedsLayout。可能导致这种情况的另一件事是辞去您将视频作为第一响应者的视图控制器(您可以搜索是否在某个地方使用了methon resignfirstresponder 并尝试在没有它的情况下它是如何工作的)。如果这不起作用,我不知道,这件事可能非常棘手,并且取决于您如何实现它。但是对于您所说的事情,您应该不需要太多代码,因为视图的自动旋转和调整大小现在由视图编辑器的尺寸检查器处理。

      我认为应该这样做。

      【讨论】:

      • 退出全屏后,我已经调用了代码来调整我的元素(在方向更改期间调用的代码相同)。所以我不认为是这样,但感谢您的回复。
      • 我用更多提示编辑了回复,如果这不起作用,我不知道。但正如我最后所说,自动调整大小由视图编辑器处理,您不需要太多代码来调整视频视图的大小,只需在尺寸检查器中适当配置视图即可。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多