2014-09-10 16 views
12

Tôi có một ứng dụng nơi người dùng có thể mở video từ UIWebview, bao gồm cả video trên Youtube. Trong iOS7, tôi có thể nhận được thông báo khi nó bắt đầu phát hoặc khi màn hình trở thành toàn màn hình, điều quan trọng là tôi phải hiển thị các tùy chọn nhất định cho người dùng và sửa đổi giao diện.Phát hiện khi video trên webview trở thành toàn màn hình trên ios8

tôi sử dụng để sử dụng này:

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

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

Tuy nhiên, vì iOS8, tôi không thể đạt được điều này. Nó giống như thông báo không còn được kích hoạt từ video UIWebview nữa. Tuy nhiên, nó vẫn được kích hoạt từ các video bình thường, không phải là Webview, như tôi đã thử nghiệm.

Mọi ý tưởng về những gì đã thay đổi?

Trả lời

19

Đây là công việc xung quanh tôi tìm thấy cho này ..

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(VideoExitFullScreen:) 
               name:UIWindowDidBecomeVisibleNotification 
               object:self.view.window]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(VideoEnterFullScreen:) 
               name:UIWindowDidBecomeHiddenNotification 
               object:self.view.window]; 
+3

Tôi đã phát hiện ra rằng ** UIWindowDidBecomeVisibleNotification ** được gọi khi video bắt đầu phát toàn màn hình. Và ** UIWindowDidBecomeHiddenNotification ** được gọi khi video biến mất. –

+0

@IgorKulagin đúng vậy. – NorthBlast

+0

Bạn tiết kiệm đêm của tôi :) –

5

Đối Swift & iOS 9:

NSNotificationCenter.defaultCenter().addObserverForName(
    UIWindowDidResignKeyNotification, 
    object: self.view.window, 
    queue: nil 
) { notification in 
    print("Video is now fullscreen") 
} 


NSNotificationCenter.defaultCenter().addObserverForName(
    UIWindowDidBecomeKeyNotification, 
    object: self.view.window, 
    queue: nil 
) { notification in 
    print("Video stopped") 
} 
0

Đối nhanh chóng:

NotificationCenter.default.addObserver(self, selector: #selector(xxx), name: NSNotification.Name.MPMoviePlayerDidExitFullscreen, object: nil)

+0

Thao tác này sẽ không còn hoạt động cho iOS 9, v.v. Nó hiện không còn được dùng nữa. – Tobonaut

0

@ câu trả lời NorthBlast của hoạt động tốt để phát hiện bất kỳ UIWindow nào xuất hiện trên đầu trang của UIViewController giữ UIWebView. Thật không may, rất khó để lọc loại UIWindow là (vì, tốt ... bạn không thể thực sự biết nếu nó là một video hoặc một số loại cửa sổ khác).

Có 3 trường hợp đặc biệt tôi thích để lọc, trong đó bạn chắc chắn họ KHÔNG cửa sổ máy nghe nhạc video, đó là:

1) _UIAlertControllerShimPresenterWindow, mà là một loại cửa sổ xuất hiện khi sử dụng cảnh báo (như UIAlertView).

2) UITextEffectsWindow, xuất hiện khi trình bày các cửa sổ iOS đặc biệt (như cửa sổ chia sẻ, UIActivityViewController).

3) UIRemoteKeyboardWindow xuất hiện khi trình bày bàn phím (vì lý do nào đó, lớp này chỉ xuất hiện với tôi khi sử dụng Swift, nhưng trên Objective-C nó không ... không có đầu mối tại sao).

Vì vậy, để đăng ký thông báo, tôi sử dụng (giống như @NorthBlast nói):

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(windowDidBecomeActive:) 
              name:UIWindowDidBecomeVisibleNotification 
              object:nil]; 

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(windowDidBecomeHidden:) 
              name:UIWindowDidBecomeHiddenNotification 
              object:nil]; 

Sau đó, việc triển khai:

- (void)windowDidBecomeActive:(NSNotification *)notification { 
    if ([self isVideoPlayerWindow:notification.object]) { 
     // Do what's needed if it is a video 
     // For example, on a live streaming radio app, I would stop the audio if a video is started 
    } 
} 

- (void)windowDidBecomeHidden:(NSNotification *)notification { 
    if ([self isVideoPlayerWindow:notification.object]) { 
     // Do what's needed if it is a video 
    } 
} 

- (BOOL)isVideoPlayerWindow:(id)notificationObject { 
    /* 
    Define non video classes here, add more if you need it 
    */ 
    static NSArray *nonVideoClasses = @[ 
     @"_UIAlertControllerShimPresenterWindow", 
     @"UITextEffectsWindow", 
     @"UIRemoteKeyboardWindow" 
    ]; 

    BOOL isVideo = YES; 
    for (NSString *testClass in nonVideoClasses) { 
     isVideo = isVideo && ! [notificationObject isKindOfClass:NSClassFromString(testClass)]; 
    } 

    return isVideo; 
} 
Các vấn đề liên quan