5

由于某些原因,我的应用程序仅支持纵向。
但是,在某些情况下,我需要显示来自 UIWebView(带有video标签)的视频,如果用户可以纵向或横向查看它会很好。

控制器配置如下:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return UIInterfaceOrientationIsPortrait(toInterfaceOrientation);
}

结果:视频仅以纵向模式播放(好的,完全可以预期)。

我试过:
- 设置它以在用户开始视频时支持所有方向
- 当视频停止时,返回“仅纵向”

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    // autorotationEnabled is toggled when a video is played / stopped
    return autorotationEnabled ? YES : UIInterfaceOrientationIsPortrait(toInterfaceOrientation);
}

结果:横向模式可用(太好了!)但如果用户在横向播放时点击“完成”,一旦玩家被解雇,前一个视图将以横向模式出现(不太好)。

有没有人知道当玩家被解雇时如何防止控制器以横向模式显示?
(使用 UIDevice 的私有方法 setInterfaceOrientation 不是一个选项)

4

1 回答 1

2

我做过非常相似的事情。您必须修改 UIView 堆栈以强制应用在弹出控制器时调用 shouldAutorotateToInterfaceOrientation。

在您的 WebViewController 设置为允许自动旋转:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return YES;
}

在父控制器中禁止自动旋转:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

创建并分配一个 UINavigationControllerDelegate。
在delegate中,临时修改控制器pop或push时的UIView栈:

- (void)navigationController:(UINavigationController *)navigationController 
  willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {

// Force portrait by changing the view stack to force autorotation!
if ([UIDevice currentDevice].orientation != UIInterfaceOrientationPortrait) {
    if (![viewController isKindOfClass:[MovieWebViewController class]]) {
        UIWindow *window = [[UIApplication sharedApplication] keyWindow];
        UIView *view = [window.subviews objectAtIndex:0];
        [view removeFromSuperview];
        [window insertSubview:view atIndex:0];
    }
}

这是一种肮脏的黑客攻击,但它有效。

于 2011-04-21T08:23:07.803 回答