From 946bcec8fbbfbb4d3bd1767e3a8d55a759576017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=9C=89=E9=98=B3?= Date: Wed, 7 Mar 2018 10:59:44 +0800 Subject: [PATCH 1/2] + [iOS] add WXVideoComponent "poster" attribute. --- .../Sources/Component/WXVideoComponent.h | 2 + .../Sources/Component/WXVideoComponent.m | 65 +++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/ios/sdk/WeexSDK/Sources/Component/WXVideoComponent.h b/ios/sdk/WeexSDK/Sources/Component/WXVideoComponent.h index 4703a7a190..bf9d908a9a 100644 --- a/ios/sdk/WeexSDK/Sources/Component/WXVideoComponent.h +++ b/ios/sdk/WeexSDK/Sources/Component/WXVideoComponent.h @@ -30,8 +30,10 @@ typedef NS_ENUM(NSInteger, WXPlaybackState) { @interface WXVideoView : UIView @property (nonatomic, copy) void (^playbackStateChanged)(WXPlaybackState state); +@property (nonatomic, copy) void (^posterClickHandle)(void); - (void) setURL:(NSURL*)URL; +- (void) setPosterURL:(NSURL *)posterURL; - (void) play; - (void) pause; diff --git a/ios/sdk/WeexSDK/Sources/Component/WXVideoComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXVideoComponent.m index d9aadc46cb..42c61e2ac7 100644 --- a/ios/sdk/WeexSDK/Sources/Component/WXVideoComponent.m +++ b/ios/sdk/WeexSDK/Sources/Component/WXVideoComponent.m @@ -21,6 +21,7 @@ #import "WXHandlerFactory.h" #import "WXURLRewriteProtocol.h" #import "WXSDKEngine.h" +#import "WXImgLoaderProtocol.h" #import #import @@ -41,6 +42,9 @@ @interface WXVideoView() @property (nonatomic, strong) UIViewController* playerViewController; @property (nonatomic, strong) AVPlayerItem* playerItem; @property (nonatomic, strong) WXSDKInstance* weexSDKInstance; +@property (nonatomic, strong) UIImageView *posterImageView; +@property (nonatomic, strong) id imageOperation; +@property (nonatomic, assign) BOOL playerDidPlayed; @end @@ -85,6 +89,13 @@ - (id)init } [self addSubview:_playerViewController.view]; + + _posterImageView = [[UIImageView alloc] init]; + _posterImageView.userInteractionEnabled = YES; + [_posterImageView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(posterTapHandler)]]; + _posterImageView.hidden = YES; + [self addSubview:_posterImageView]; + [self bringSubviewToFront:_posterImageView]; } return self; } @@ -147,6 +158,7 @@ - (void)setFrame:(CGRect)frame videoFrame.origin.x = 0; videoFrame.origin.y = 0; [_playerViewController.view setFrame:videoFrame]; + [_posterImageView setFrame:videoFrame]; } - (void)setURL:(NSURL *)URL @@ -188,6 +200,24 @@ - (void)setURL:(NSURL *)URL } } +- (void)setPosterURL:(NSURL *)posterURL { + if (!posterURL) { + return; + } + + [self cancelImage]; + __weak typeof(self) weakSelf = self; + weakSelf.imageOperation = [[self imageLoader] downloadImageWithURL:posterURL.absoluteString imageFrame:self.posterImageView.frame userInfo:nil completed:^(UIImage *image, NSError *error, BOOL finished) { + dispatch_async(dispatch_get_main_queue(), ^{ + __strong typeof(self) strongSelf = weakSelf; + if (!error) { + strongSelf.posterImageView.image = image; + strongSelf.posterImageView.hidden = strongSelf.playerDidPlayed; + } + }); + }]; +} + - (void)playFinish { if (_playbackStateChanged) @@ -203,6 +233,7 @@ - (void)playFinish - (void)play { + _posterImageView.hidden = YES; if ([self greater8SysVer]) { AVPlayerViewController *AVVC = (AVPlayerViewController*)_playerViewController; @@ -224,12 +255,35 @@ - (void)pause } } +- (void)posterTapHandler { + if (self.posterClickHandle) { + self.posterClickHandle(); + } +} + +- (id)imageLoader +{ + static id imageLoader; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + imageLoader = [WXHandlerFactory handlerForProtocol:@protocol(WXImgLoaderProtocol)]; + }); + return imageLoader; +} + +- (void)cancelImage +{ + [_imageOperation cancel]; + _imageOperation = nil; +} + @end @interface WXVideoComponent() @property (nonatomic, weak) WXVideoView *videoView; @property (nonatomic, strong) NSURL *videoURL; +@property (nonatomic, strong) NSURL *posterURL; @property (nonatomic) BOOL autoPlay; @property (nonatomic) BOOL playStatus; @@ -252,6 +306,9 @@ - (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDict if ([attributes[@"playStatus"] compare:@"pause" options:NSCaseInsensitiveSearch] == NSOrderedSame) { _playStatus = false; } + if (attributes[@"poster"]) { + _posterURL = [NSURL URLWithString: attributes[@"poster"]]; + } } return self; } @@ -268,6 +325,7 @@ -(void)viewDidLoad { _videoView = (WXVideoView *)self.view; [_videoView setURL:_videoURL]; + [_videoView setPosterURL:_posterURL]; if (_playStatus) { [_videoView play]; } else { @@ -277,6 +335,9 @@ -(void)viewDidLoad [_videoView play]; } __weak __typeof__(self) weakSelf = self; + _videoView.posterClickHandle = ^{ + [weakSelf.videoView play]; + }; _videoView.playbackStateChanged = ^(WXPlaybackState state) { NSString *eventType = nil; switch (state) { @@ -319,6 +380,10 @@ -(void)updateAttributes:(NSDictionary *)attributes _playStatus = false; [_videoView pause]; } + if (attributes[@"poster"]) { + _posterURL = [NSURL URLWithString: attributes[@"poster"]]; + [_videoView setPosterURL:_posterURL]; + } } @end From b0e44554f107ee1d3456c08d655ab98ae3d3fdb1 Mon Sep 17 00:00:00 2001 From: xuyouyang Date: Thu, 8 Mar 2018 13:41:48 +0800 Subject: [PATCH 2/2] [WEEX-241][iOS] add WXVideoComponent "poster" attribute. Lazy load UIImageView property. --- .../Sources/Component/WXVideoComponent.m | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/ios/sdk/WeexSDK/Sources/Component/WXVideoComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXVideoComponent.m index 42c61e2ac7..82b2be5d9b 100644 --- a/ios/sdk/WeexSDK/Sources/Component/WXVideoComponent.m +++ b/ios/sdk/WeexSDK/Sources/Component/WXVideoComponent.m @@ -89,13 +89,6 @@ - (id)init } [self addSubview:_playerViewController.view]; - - _posterImageView = [[UIImageView alloc] init]; - _posterImageView.userInteractionEnabled = YES; - [_posterImageView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(posterTapHandler)]]; - _posterImageView.hidden = YES; - [self addSubview:_posterImageView]; - [self bringSubviewToFront:_posterImageView]; } return self; } @@ -158,7 +151,6 @@ - (void)setFrame:(CGRect)frame videoFrame.origin.x = 0; videoFrame.origin.y = 0; [_playerViewController.view setFrame:videoFrame]; - [_posterImageView setFrame:videoFrame]; } - (void)setURL:(NSURL *)URL @@ -261,6 +253,18 @@ - (void)posterTapHandler { } } +- (UIImageView *)posterImageView { + if (!_posterImageView) { + _posterImageView = [[UIImageView alloc] initWithFrame:self.bounds]; + _posterImageView.userInteractionEnabled = YES; + [_posterImageView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(posterTapHandler)]]; + _posterImageView.hidden = YES; + [self addSubview:_posterImageView]; + [self bringSubviewToFront:_posterImageView]; + } + return _posterImageView; +} + - (id)imageLoader { static id imageLoader;