IOS6 landscape playing embedded youtube video from a uiwebview within an only portrait iPhone app

前端 未结 2 567
梦谈多话
梦谈多话 2021-02-08 23:18

I\'ve got an iPhone application with a storyboard,few xib and custom cells.

The application is set as a \"portrait\" as \"supported interface orientation\" (i mean every

相关标签:
2条回答
  • 2021-02-08 23:45

    I took Almas Adilbek's answer (very nicely done!) and boiled it down to its essential component. Just this code alone (added to my app delegate) seems to be getting the desired results for me. Will update if I run into any issues.

    - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    
        id presentedViewController = [window.rootViewController presentedViewController];
        NSString *className = presentedViewController ? NSStringFromClass([presentedViewController class]) : nil;
    
        if (window && [className isEqualToString:@"MPInlineVideoFullscreenViewController"]) {
            return UIInterfaceOrientationMaskAll;
        } else {
            return UIInterfaceOrientationMaskPortrait;
        }
    }
    
    0 讨论(0)
  • 2021-02-08 23:51

    I had same problem. My solution is:

    1.First of all turn on all orientations in your xcode project:

    enter image description here

    2.In AppDelegate.m add:

    -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
    {
        NSArray *stackViewControllers = self.navigationController.viewControllers;
        UIViewController *rvc = [stackViewControllers objectAtIndex:stackViewControllers.count - 1];
    
        if([rvc isKindOfClass:[VideoViewController class]])
        {
            id presentedViewController = [rvc presentedViewController];
    
            NSString *viewControllerName = NSStringFromClass([presentedViewController class]);
            if([viewControllerName isEqual:@"MPInlineVideoFullscreenViewController"] && [VideoViewController isVideoPlaying]) {
                return UIInterfaceOrientationMaskAll;
            }
        }
        return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
    }
    

    In above code, everytime system asks for supportedInterfaceOrientationsForWindow you check if current viewController is that where you've put UIWebView with youtube player embedded and also check if video is playing now (namely video is in fullscreen mode).
    NOTE: I use UINavigationController, if you don't, you must make some changes to get current viewController.

    3.In viewController where I I've put UIWebView for youtube embedded player (In my case it is VideoViewController), in it's header file add method:

    +(BOOL)isVideoPlaying;
    


    4.In VideoViewController.m add static variable:

    static BOOL _isVideoPlaying = NO;
    


    5.In viewDidLoad add addObserver for notifications, in order to know, when video started to play and willExitPlaying:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerStarted:) name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerWillExitFullscreen:) name:@"UIMoviePlayerControllerWillExitFullscreenNotification" object:nil];
    


    6. Also, add notification selector methods:

    -(void)playerStarted:(NSNotification *)notification{
        _isVideoPlaying = YES;
    }
    -(void)playerWillExitFullscreen:(NSNotification *)notification {
        _isVideoPlaying = NO;
    
        if([AppUtils iOSVersion] < 6) //For iOS < 6.0, you must manually rotate viewController's view when fullscreen video playing is dismissed.
        {
            if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight)
            {
                self.navigationController.view.userInteractionEnabled = NO;
                [UIView animateWithDuration:0.5 animations:^{
                    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft  animated:NO];
                    // rotate main view, in this sample the view of navigation controller is the root view in main window
                    [self.navigationController.view setTransform: CGAffineTransformMakeRotation(180 * M_PI * 0.5)];
                    // set size of view
                    [self.navigationController.view setFrame:CGRectMake(0, 0, 320, 960)];
                } completion:^(BOOL finished) {
                    self.navigationController.view.userInteractionEnabled = YES;
                }];
            }
        }
    }
    


    7.And, add methods in VideoViewController.m:

    +(BOOL)isVideoPlaying {
        return _isVideoPlaying;
    }
    
    -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
    {
        if(!isVideoPlaying) {
            return toInterfaceOrientation != UIInterfaceOrientationLandscapeLeft && toInterfaceOrientation != UIInterfaceOrientationLandscapeRight;
        }
        return YES;
    }
    


    All this tricks works well for me, supporting iOS 5 and later.
    Hope it works for you!

    0 讨论(0)
提交回复
热议问题