2015-07-17 5 views
20

Ich möchte einige benutzerdefinierte Steuerelemente über UIWebView 's Video Player hinzufügen. Ich kann keine Kontrolle über sie von unten Code hinzufügen: Zuerst i unten Mitteilung wirdWie fügt man OverLay View im UIWebView Video Player hinzu?

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

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

Aber diese Ansicht

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

Dann davon bin Hinzufügen bei Empfang statisch auf der Oberseite UIWebView ist die Videoansicht. Aber ich möchte erreichen wie wenn sich die Steuerung des Video Players verbirgt dann möchte ich meine eigene Ansicht ausblenden.

Mit anderen Worten möchte ich benutzerdefinierte OverLayView auf UIWebView Video Player Ansicht erreichen.

Bitte helfen Sie mir diesbezüglich.

+0

Erhalten Sie View-Referenz von windowviews und entfernen Sie diese Ansicht zur gleichen Zeit. – Alok

+0

Warum verwenden Sie keinen anderen benutzerdefinierten Videoplayer? – Atrash

Antwort

0

Es scheint, dass es "out of the box" nicht möglich ist. Die Dokumentation erklärt, dass die Video-Player-Benachrichtigungen in diesen Situationen aussendet:

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 

So gibt es keinen Weg, um zu wissen, wann die Kontrollen hide/show taten.

Wenn Sie nur einmal Ihre Ansicht zeigen, nachdem der Benutzer die Ansicht öffnet, können Sie diese ziemlich leicht zu erreichen, zum Beispiel mit Animation:

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

Beachten Sie, dass dies Ihre Ansicht nicht verbergen, wenn die Benutzer verwirft die Kontrollen.

Wenn Sie Ihre Ansicht jedes Mal anzeigen/ausblenden möchten, wenn die Steuerelemente ein-/ausgeblendet werden, wird es viel komplizierter. Ein Ansatz wäre, Standardsteuerungen zu deaktivieren und neu zu erstellen - bedenken Sie, dass dies nicht einfach ist.

+0

Ich möchte nicht nur einmal angezeigt werden. Diese Ansicht muss mit den Steuerelementen des UIWebView-Players synchronisiert werden. –

+0

Ok, so scheint es, dass die Implementierung einer ganzen Reihe von benutzerdefinierten Steuerelementen der Weg für Sie ist. Wie ich bereits sagte, ist dies keine leichte Aufgabe. – Losiowaty

+0

Ja. Es wird nicht einfach sein :) –

0

Dies ist ziemlich der Hack, aber es funktioniert.

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

Ich werde versuchen, Sie zu aktualisieren –

+0

Hallo, CustomView erscheint nur einmal. Wenn ich das Video schließe und ein anderes Video abspiele, wird es nicht angezeigt. –

0

Sie können iOS-JavaScript-Brücke verwenden, um dies zu erreichen.

Sie können Ihr Skript in WebView laden, die einige Elemente oder seine Eigenschaftenänderung beobachten. Und verwenden Sie Bridge, um zwischen Ihrem Java-Skript und dem nativen iOS-Code zu kommunizieren.

Sie können nach unten für weitere Hilfe schauen. https://developer.apple.com/library/content/documentation/AppleApplications/Conceptual/SafariJSProgTopics/ObjCFromJavaScript.html#//apple_ref/doc/uid/30001215-BBCBFJCD

Sie können auch HTML-Überlagerungsansicht auf Spieler hinzufügen, wenn Sie stark genug sind, diese Ansicht mit HTML zu erstellen.

Verwandte Themen