2013-06-19 24 views
10

Ứng dụng iPhone của tôi là ứng dụng chỉ có hướng dọc và trong ứng dụng của tôi Tôi có số UITableView có số UIWebView trong UITableCell đầu tiên. UIWebView hiển thị video youtube được nhúng. Khi tôi nhấp vào video để phát video, hãy chuyển sang chế độ toàn màn hình. Những gì tôi cần làm là cho phép người dùng xoay thiết bị của họ và phát video ở chế độ ngang. Sau đó, khi video dừng lại chỉ cho phép bức chân dung một lần nữa. Tôi thiết lập để nghe thông báo khi video chuyển sang chế độ toàn màn hình và rời khỏi chế độ toàn màn hình. Nhưng tôi không biết cách lập trình cho phép người dùng xoay hướng giao diện.Cho phép UIInterfaceOrientationLandscape trong khi phát lại video UIWebView

nên về cơ bản tôi đã 2 phương pháp gọi khi thông báo được truyền

[[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. 
} 

tôi sẽ làm gì để trong những 2 phương pháp để cho phép thay đổi hướng chỉ trong thời gian phát lại video?

+0

Hãy cẩn thận, vì iOS6 thông báo cho 'nút video thực hiện' dường như là: 'UIMoviePlayerControllerWillExitFullscreenNotification' (xem: http://stackoverflow.com/a/8554040/1436861 và http: // stackoverflow. com/a/12681507/1436861) –

+0

bản sao có thể có của [UIMoviePlayerControllerDidEnterFullscreenNotification không hoạt động trong iOS8] (http://stackoverflow.com/questions/25561812/uimovieplayercontrollerdidenterfullscreennotification-not-work-in-ios8) –

Trả lời

19

Tôi đã tìm ra. Trong 2 phương pháp của tôi:

-(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]; 
} 

Tôi đã truy cập ủy quyền ứng dụng của mình theo các phương pháp trên bằng cách đặt thuộc tính BOOL của AppDelegate của tôi. Sau đó, tôi gọi là phương pháp ứng dụng dưới đây trong AppDelegate.m tôi:

- (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; 
} 
} 

Các self.fullScreenVideoIsPlaying là một BOOL mà tôi thiết lập như là một tài sản trong tập tin AppDelegate.h tôi.

Tôi hy vọng điều này sẽ giúp những người khác trong 5 giờ tôi đã mất việc tìm ra.

+0

Cảm ơn bạn !! Tôi đã dành vài giờ để tìm kiếm câu trả lời cho vấn đề này và giải pháp của bạn là đơn giản nhất. Nhiều đánh giá cao :) –

+0

Tôi đã tìm kiếm hàng giờ về cách khắc phục sự cố xoay vòng của mình. Điều này cố định nó; tuy nhiên, tôi dường như không thể tắt nó sau khi video kết thúc. Bạn đã đặt cuộc gọi thông báo cho youTubeFinished ở đâu? – helloimbarbara

+1

Nevermind, tôi đã sửa nó. Tôi nhận ra toàn bộ ứng dụng của mình đang quay. Để khắc phục điều này, tôi chỉ gỡ bỏ câu lệnh if (self.window.rootViewController) trong phương thức supportedInterfaceOrientationsForWindow.Bây giờ mọi thứ hoạt động hoàn hảo. Cảm ơn bạn đã đăng bài này! – helloimbarbara

0

Bạn sẽ có một biến trạng thái toàn cầu, có lẽ trong đại biểu ứng dụng của bạn hoặc bất cứ nơi nào bạn lưu trữ các biến của bạn nên có thể truy cập trên toàn cầu, và sau đó đặt nó vào true hoặc false tùy thuộc vào thời tiết các máy nghe nhạc phim là trong toàn màn hình hay không. Trong các cuộc gọi lại được gọi để xoay ứng dụng, bạn kiểm tra trạng thái của biến và tùy thuộc vào sự trở lại đó nếu xoay vòng được phép hay không.

+0

Tôi có lẽ nên nói rằng tôi cũng đã có một bộ BOOL vì lý do chính xác đó nhưng tôi đã thất bại trong việc cố gắng thay đổi nếu xoay vòng được cho phép hay không trong cuộc gọi quay lại để xoay ứng dụng. Bạn có thể chỉ cho tôi một số mã cho phép điều đó không? –

2

Nếu bạn chỉ muốn hỗ trợ phát lại ngang ở chế độ toàn màn hình. Từ iOS 8 trở đi, video từ UIWebView phát bên trong AVPlayerViewController.

Trong kiểm tra AppDelegate của bạn nếu cửa sổ trình bày chứa 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 
} 
Các vấn đề liên quan