2015-07-17 12 views
20

Desidero aggiungere alcuni controlli personalizzati oltre al lettore video UIWebView. Sono in grado di aggiungere qualsiasi controllo su di esso dal codice qui sotto: Primo sto aggiungendo di seguito la notifica,Come aggiungere OverLay View in UIWebView Video Player?

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

Poi sulla ricezione di esso,

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

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

Ma questo punto di vista sarà staticamente in cima Vista video di UIWebView. Ma io voglio realizzare come quando i controlli di Video player verranno nascosti, quindi voglio nascondere la mia vista personalizzata.

In altre parole, desidero ottenere personalizzato OverLayView nella vista Video Player di UIWebView.

Please help me per quanto riguarda questo.

+0

ottenere il riferimento di vista da window.subviews e rimuovere quella vista sullo stesso tempo. – Alok

+0

perché non usi altri lettori video personalizzati? – Atrash

risposta

0

Sembra che non sia possibile "out of the box". I documenti affermano che il giocatore di film emette le notifiche in queste situazioni:

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 

Quindi non c'è modo di conoscere quando i controlli hanno fatto nascondi/mostra.

Se desideri mostrare la tua vista solo una volta, dopo che l'utente apre la vista, si può raggiungere questo abbastanza facilmente, per esempio con l'animazione:

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

Nota che questo non nascondere il proprio vista quando il l'utente scarta i controlli.

Se si desidera mostrare/nascondere la vista ogni volta che vengono visualizzati i controlli/nascosta diventa molto più complicato. Un approccio potrebbe essere quello di disabilitare i controlli standard e ricrearli, tenendo presente che non è facile.

+0

Non voglio apparire solo una volta. Quella vista deve essere sincronizzata con i controlli su Player di UIWebView. –

+0

Ok, quindi sembra che implementare un intero set di controlli personalizzati sarebbe la soluzione giusta per te. Come ho affermato prima, questo non è un compito facile. – Losiowaty

+0

Sì. Non sarà facile :) –

0

questo è abbastanza l'hack, ma funziona.

// 
// 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

Cercherò di aggiornarti –

+0

Ciao, CustomView appare solo una volta. Se chiudo il video e riproduco un altro, non viene visualizzato. –

0

Per eseguire questa operazione è possibile utilizzare il ponte iOS-JavaScript.

È possibile caricare lo script in WebView che osservano alcuni elementi o il suo cambiamento di proprietà. E usa Bridge per comunicare tra lo script java e il codice nativo di iOS.

Si può prendere guardare riferimento muggito per ulteriori informazioni. https://developer.apple.com/library/content/documentation/AppleApplications/Conceptual/SafariJSProgTopics/ObjCFromJavaScript.html#//apple_ref/doc/uid/30001215-BBCBFJCD

È anche possibile aggiungere la visualizzazione di sovrapposizione HTML sul lettore se si è abbastanza forti da creare tale visualizzazione utilizzando HTML.

Problemi correlati