检测iOS设备的屏幕方向锁定

10

我如何以编程方式检查iOS设备方向是否已锁定?在UIDevice中我找不到任何信息。我知道这应该对应用程序透明,但如果方向被锁定(如Youtube应用程序所做的那样;它会锁定为横屏而不是竖屏),我想更改显示内容的方式。这肯定是可能的。


YouTube 的做法也不是完美的;如果你离开应用并返回,视频将会旋转到竖屏模式,即使它被锁定。 - BoltClock
3个回答

10
您可以使用UIAccelerometer类来详细确定手机的方向。如果加速度矢量进入其最大绝对分量位于X轴的状态,则为横向方向。理论上,这可以用于检测方向锁定:如果在发生这种情况的几秒钟内,控制器没有收到shouldRotateToInterfaceOrientation的调用,并且[[UIDevice currentDevice] orientation]属性不是横向的,则可以安全地假定用户已将方向锁定。
这很复杂,并且存在延迟,因为shouldRotateToInterfaceOrientation会在实际向量实际进入横向区域之后很长时间才被调用。整个想法有点像黑客行为,您应该重新考虑为什么需要在用户不想显示它们时呈现横向视图。

7

没有方法可以检测方向是否被锁定。YouTube应用程序不会锁定到横向模式,它只是以横向方向显示视频,但是如果您旋转iPhone,视频也会随之旋转(如果没有方向锁定)。

也就是说,方向锁定由系统处理,对于您的应用程序来说是透明的。

如果您想实现此功能-即使iPhone处于纵向模式,也要以横向模式显示您的视图,然后启用视图的旋转。它将以与YouTube应用程序相同的方式工作。

更新评论:

.h

BOOL rotationEnabled;

.m

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
  return rotationEnabled || ( toInterfaceOrientation == UIInterfaceOrientationLandscapeRight );
}

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  rotationEnabled = YES;
}

我所知道的在特定方向上显示视图的唯一方法是:- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) toInterfaceOrientation { toInterfaceOrientation == UIInterfaceOrientationLandscapeRight;} 但这会禁用自动旋转。 - wombat57
看看我的更新答案。一个如何最初以LandscapeRight显示,然后允许旋转的示例。 - zrzka
在iOS 6中,shouldAutorotateToInterfaceOrientation:方法已被弃用,但新的方法preferredInterfaceOrientationForPresentation将为您提供与此片段相同的行为,而无需任何其他代码。 - John Starr Dewar

0

我认为你无法找出方向是否被锁定。我之前搜索过,但没有发现任何信息。你可以忽略方向并在你的视图控制器中仅提供横向模式...然后它将以横向模式显示,无论如何。

我认为这也是 YouTube 所做的。


是的,这正是我担心的。但是YouTube确实检测到了锁定。如果我将手机竖直持握并打开视频,它会以竖屏播放(并随着我旋转手机而旋转)。如果我锁定方向并做同样的事情,它会以横屏模式打开。这不是默认行为。YouTube正在检测锁定并切换到横屏模式。 - wombat57
@wombat57 这是默认行为。当锁定被设置或取消时,-[UIViewController shouldRotateToInterfaceOrientation:] 将被调用。 - user142019
2
无论锁定是否设置,调用该函数都没有关系;我的应用程序可能没有运行。问题在于区分锁定纵向和未锁定纵向。主要是Izzy提供了一个很好的旋转解决方案。 - wombat57

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