10

我的 iPhone 应用程序是一个仅限纵向的应用程序,在我的应用程序中,我有UITableView一个UIWebView在第一个UITableCell. 显示UIWebView嵌入的 youtube 视频。当我点击视频播放时,它进入全屏模式。我需要做的是,允许用户旋转他们的设备并以横向模式播放视频。然后当视频停止时,只允许再次纵向。我设置在视频进入全屏并离开全屏时收听通知。但我不知道如何以编程方式允许用户旋转界面方向。

所以基本上我在通知传递时调用了 2 个方法

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(youTubeStarted:) name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(youTubeFinished:) name:@"UIMoviePlayerControllerDidExitFullscreenNotification" object:nil];

-(void)youTubeStarted:(NSNotification *)notification{
    // Entered fullscreen code goes here.
}

-(void)youTubeFinished:(NSNotification *)notification{
    // Left fullscreen code goes here.
}

我将在这 2 种方法中放入什么以仅在视频播放期间允许方向更改?

4

3 回答 3

19

我想到了。在我的两种方法中:

-(void)youTubeStarted:(NSNotification *)notification{
   // Entered Fullscreen code goes here..
   AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
   appDelegate.fullScreenVideoIsPlaying = YES;
}

-(void)youTubeFinished:(NSNotification *)notification{
   // Left fullscreen code goes here...
   AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
   appDelegate.fullScreenVideoIsPlaying = NO;

   //CODE BELOW FORCES APP BACK TO PORTRAIT ORIENTATION ONCE YOU LEAVE VIDEO.
   [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO];
    //present/dismiss viewcontroller in order to activate rotating.
    UIViewController *mVC = [[UIViewController alloc] init];
    [self presentModalViewController:mVC animated:NO];
    [self dismissModalViewControllerAnimated:NO];
}

通过设置 AppDelegate 的 BOOL 属性,我在上述方法中访问了我的 App 委托。然后我在我的 AppDelegate.m 中调用了下面的应用程序方法:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
NSUInteger orientations = UIInterfaceOrientationMaskPortrait;
if (self.fullScreenVideoIsPlaying == YES) {
    return UIInterfaceOrientationMaskAllButUpsideDown;
}
else {
    if(self.window.rootViewController){
        UIViewController *presentedViewController = [[(UINavigationController  *)self.window.rootViewController viewControllers] lastObject];
        orientations = [presentedViewController supportedInterfaceOrientations];

    }
    return orientations;
}
}

self.fullScreenVideoIsPlayingBOOL我在 AppDelegate.h 文件中设置为属性的一个。

我希望这可以帮助其他人解决我失去的 5 个小时。

于 2013-06-19T07:19:45.450 回答
2

如果您只想支持全屏横向播放。从 iOS 8 开始,从UIWebView里面播放视频AVPlayerViewController

在您的 AppDelegate 检查呈现窗口是否包含AVPlayerViewController.

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {

    if let w = window, let root = w.rootViewController {

        if root.childViewControllers.first is AVPlayerViewController {  
            return UIInterfaceOrientationMask.allButUpsideDown
        }
    }

    return UIInterfaceOrientationMask.portrait
}
于 2017-04-24T13:30:57.103 回答
0

您将有一个全局状态变量,可能在您的应用程序委托中或您存储应该可全局访问的变量的任何位置,然后将其设置为truefalse取决于电影播放器​​是否处于全屏状态。在调用以旋转应用程序的回调中,您检查变量的状态,并根据该返回值是否允许旋转。

于 2013-06-19T02:12:28.903 回答