2015-07-17 34 views
20

UIWebView 's Video Oynatıcı üzerinde bazı özel denetimler eklemek istiyorum. Ben aşağıda koduna göre bunun üzerinde herhangi bir kontrol eklemek mümkün duyuyorum : İlk i bildirim altına ekliyorum,UIWebView Video Oynatıcı'da OverLay Görünümü nasıl eklenir?

bunun alma Sonra
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addOverLayView:) name:UIWindowDidBecomeVisibleNotification object:nil]; 

,

-(void)addOverLayView:(NSNotification*)aNotification{ 
    UIWindow *window = (UIWindow *)aNotification.object; 

    if (window != self.view.window) { 
     [window addSubview:anyCustomview]; 
    } 
} 

Fakat bu bakış olacak statik üstünde UIWebView 's Video görünümü. Ancak Video oynatıcının kontrolleri gizleneceği zaman, özel View'imi gizlemek istediğimde başarmak istiyorum. Başka bir deyişle

i özel OverLayViewUIWebView 'ın Video Player görünümünde elde etmek istiyor.

Lütfen bu konuda bana yardımcı olun.

+0

window.subviews kaynağından referans alın ve bu görünümü aynı anda kaldırın. – Alok

+0

neden başka bir özel video oynatıcı kullanmıyorsunuz? – Atrash

cevap

0

"Kutunun dışında" mümkün görünmüyor.

When the movie player begins playing, is paused, or begins seeking forward or backward 
When AirPlay playback starts or ends 
When the scaling mode of the movie changes 
When the movie enters or exits fullscreen mode 
When the load state for network-based movies changes 
When meta-information about the movie itself becomes available 

Yani kontrolleri gizlemek/göstermek ne zaman tanımanın yolu yoktur: docs film oyuncusu bu durumlarda bildirimleri yayar ifade etmektedirler.

Eğer sadece bir kez görünümünüzü göstermek için kullanıcı görünümünü açar sonra, sen animasyon ile, örneğin oldukça kolay bunu başarabilirsiniz isterseniz:

-(void)addOverLayView:(NSNotification*)aNotification{ 
    UIWindow *window = (UIWindow *)aNotification.object; 

    if (window != self.view.window) { 
     [window addSubview:anyCustomview]; 

     [UIView animateWithDuration:2 //choose a fitting value here 
           delay:3 //this has to be chosen experimentally if you want it to match with the timing of when the controls hide 
          options:UIViewAnimationOptionCurveEaseOut 
         animations:^{ 
          anyCustomView.alpha = 0.0f; //fadeout animation, you can leave this block empty to have no animation 
         } completion:^(BOOL finished) { 
          [anyCustomView removeFromSuperview]; 
         }]; 
    } 
} 

Not Bu görünümünüzü gizlemek olmaz ne zaman kullanıcı denetimleri atar.

Denetimler her gösterildiğinde/gizlendiğinde görünümünüzü göstermek/gizlemek isterseniz daha da zorlaşır. Bir yaklaşım, standart kontrolleri devre dışı bırakmak ve onları yeniden yaratmak olacaktır - kolay olmadığını unutmayın.

+0

Sadece bir kez görünmek istemiyorum. Bu görünüm, UIWebView's Player üzerinden kontrollerle senkronize edilmelidir. –

+0

Tamam, öyle görünüyor ki, bir dizi özel kontrolün uygulanması sizin için gitmenin yolu olacaktı. Daha önce de belirttiğim gibi, bu kolay bir iş değildir. – Losiowaty

+0

Evet. Bir kolay olmayacak :) –

0

Bu oldukça kesmek ama işe yarıyor.

// 
// ViewController.m 
// 

#import "ViewController.h" 

@interface ViewController() 

@property UIWebView *webView; 

@property UIWindow *playerWindow; 
@property UIView *customView; 
@property UIView *transitionView; 
@property NSTimer *timer; 

@end 

@implementation ViewController 

-(void)loadView 
{ 
    self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    _webView = [[UIWebView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    [self.view addSubview:_webView]; 

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

} 

-(void)addOverLayView:(NSNotification*)aNotification 
{ 
    UIWindow *window = (UIWindow *)aNotification.object; 
    _customView = [UIView new]; 
    _customView.backgroundColor = [UIColor yellowColor]; 
    _customView.frame = CGRectMake(0, [UIScreen mainScreen].bounds.size.height - 80, [UIScreen mainScreen].bounds.size.width, 80); 
    _customView.alpha = 0.0; 
    if (window != self.view.window) 
    { 
     _playerWindow = window; 
     [_playerWindow addSubview:_customView]; 
     _timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES]; 
    } 
} 

- (void)timerMethod 
{ 
    if(_transitionView) 
    { 
     UIView *view = [_transitionView.subviews lastObject]; 
     view = [view.subviews lastObject]; 
     for(UIView *subView in view.subviews) 
     { 
      if([subView.layer.sublayers count]) 
      { 
       CALayer *finalLayer = [subView.layer.sublayers lastObject]; 
       CAAnimation *animation = [finalLayer animationForKey:@"opacity"]; 
       if(animation) 
       { 
        if(finalLayer.opacity) 
        { 
         [UIView animateWithDuration:animation.duration delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
         _customView.alpha = 1.0;} completion:nil]; 
        } 
        else 
        { 
         [UIView animateWithDuration:animation.duration delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
          _customView.alpha = 0.0;} completion:nil]; 
        } 
       } 
      } 
     } 
    } 
    else 
    { 
     for(id view in _playerWindow.subviews) 
     { 
      NSString *className = [NSString stringWithFormat:@"%@", [view class]]; 
      if([className isEqualToString:@"UITransitionView"]) 
      { 
       _transitionView = view; 
       break; 
      } 
     } 

    } 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSString *fullURL = @"http://www.youtube.com"; 
    NSURL *url = [NSURL URLWithString:fullURL]; 
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 
    [_webView loadRequest:requestObj]; 
} 

@end 
+0

Ben –

+0

Merhaba, CustomView sadece bir kez görünür ve güncelleyecektir. Videoyu kapatırsam ve başka oynatırsam göstermez. –

0

Bunu yapmak için iOS-JavaScript köprüsünü kullanabilirsiniz.

Scriptinizi, bazı öğeleri veya özellik değişimini gözlemleyen WebView'a yükleyebilirsiniz. Ve java komut dosyanız ile Yerel iOS kodunuz arasında iletişim kurmak için Bridge'i kullanın.

Daha fazla yardım için referans referansına bakabilirsiniz. https://developer.apple.com/library/content/documentation/AppleApplications/Conceptual/SafariJSProgTopics/ObjCFromJavaScript.html#//apple_ref/doc/uid/30001215-BBCBFJCD

Ayrıca, HTML kullanarak bu görünümü oluşturmaya yetecek kadar güçlü iseniz, oynatıcıya HTML kaplama görünümünü de ekleyebilirsiniz.