diff --git a/AsyncDisplayKit/ASVideoPlayerNode.h b/AsyncDisplayKit/ASVideoPlayerNode.h index 1183a53467..0220f82912 100644 --- a/AsyncDisplayKit/ASVideoPlayerNode.h +++ b/AsyncDisplayKit/ASVideoPlayerNode.h @@ -31,6 +31,8 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic,assign,readonly) CMTime duration; +@property (nonatomic, assign) BOOL disableControls; + - (instancetype)initWithUrl:(NSURL*)url; - (instancetype)initWithAsset:(AVAsset*)asset; @@ -108,7 +110,7 @@ NS_ASSUME_NONNULL_BEGIN * @abstract Delegate method invoked when the ASVideoNode has played to its end time. * @param videoPlayerNode The video node has played to its end time. */ -- (void)videoPlayerNodePlaybackDidFinish:(ASVideoPlayerNode *)videoPlayer; +- (void)videoPlayerNodeDidPlayToEnd:(ASVideoPlayerNode *)videoPlayer; @end NS_ASSUME_NONNULL_END diff --git a/AsyncDisplayKit/ASVideoPlayerNode.mm b/AsyncDisplayKit/ASVideoPlayerNode.mm index a4d17bde9a..7b77824253 100644 --- a/AsyncDisplayKit/ASVideoPlayerNode.mm +++ b/AsyncDisplayKit/ASVideoPlayerNode.mm @@ -35,8 +35,6 @@ static void *ASVideoPlayerNodeContext = &ASVideoPlayerNodeContext; AVAsset *_asset; ASVideoNode *_videoNode; - - ASDisplayNode *_controlsHolderNode; NSArray *_neededControls; @@ -51,6 +49,7 @@ static void *ASVideoPlayerNodeContext = &ASVideoPlayerNodeContext; BOOL _isSeeking; CMTime _duration; + BOOL _disableControls; } @end @@ -88,6 +87,7 @@ static void *ASVideoPlayerNodeContext = &ASVideoPlayerNodeContext; } _asset = asset; + _disableControls = NO; [self privateInit]; @@ -104,10 +104,6 @@ static void *ASVideoPlayerNodeContext = &ASVideoPlayerNodeContext; _videoNode.delegate = self; [self addSubnode:_videoNode]; - _controlsHolderNode = [[ASDisplayNode alloc] init]; - _controlsHolderNode.backgroundColor = [UIColor greenColor]; - [self addSubnode:_controlsHolderNode]; - [self addObservers]; } @@ -147,10 +143,18 @@ static void *ASVideoPlayerNodeContext = &ASVideoPlayerNodeContext; { ASDN::MutexLocker l(_videoPlayerLock); + if (_disableControls) { + return; + } + if (_neededControls == nil) { _neededControls = [self createControlElementArray]; } + if (_cachedControls == nil) { + _cachedControls = [[NSMutableDictionary alloc] init]; + } + for (int i = 0; i < _neededControls.count; i++) { ASVideoPlayerNodeControlType type = (ASVideoPlayerNodeControlType)[[_neededControls objectAtIndex:i] integerValue]; switch (type) { @@ -173,17 +177,31 @@ static void *ASVideoPlayerNodeContext = &ASVideoPlayerNodeContext; break; } } + + ASPerformBlockOnMainThread(^{ + ASDN::MutexLocker l(_videoPlayerLock); + [self setNeedsLayout]; + }); } - (void)removeControls { NSArray *controls = [_cachedControls allValues]; [controls enumerateObjectsUsingBlock:^(ASDisplayNode *_Nonnull node, NSUInteger idx, BOOL * _Nonnull stop) { - [node.view removeFromSuperview]; [node removeFromSupernode]; - //node = nil; - NSLog(@"%@",_playbackButtonNode); }]; + + [self cleanCachedControls]; +} + +- (void)cleanCachedControls +{ + [_cachedControls removeAllObjects]; + + _playbackButtonNode = nil; + _elapsedTextNode = nil; + _durationTextNode = nil; + _scrubberNode = nil; } - (void)createPlaybackButton @@ -348,7 +366,7 @@ static void *ASVideoPlayerNodeContext = &ASVideoPlayerNodeContext; - (void)videoPlaybackDidFinish:(ASVideoNode *)videoNode { if (_delegateFlags.delegateVideoNodePlaybackDidFinish) { - [_delegate videoPlayerNodePlaybackDidFinish:self]; + [_delegate videoPlayerNodeDidPlayToEnd:self]; } } @@ -484,12 +502,23 @@ static void *ASVideoPlayerNodeContext = &ASVideoPlayerNodeContext; _delegateFlags.delegateLayoutSpecForControls = [_delegate respondsToSelector:@selector(videoPlayerNodeLayoutSpec:forControls:forConstrainedSize:)]; _delegateFlags.delegateVideoNodeDidPlayToTime = [_delegate respondsToSelector:@selector(videoPlayerNode:didPlayToTime:)]; _delegateFlags.delegateVideoNodeWillChangeState = [_delegate respondsToSelector:@selector(videoPlayerNode:willChangeVideoNodeState:toVideoNodeState:)]; - _delegateFlags.delegateVideoNodePlaybackDidFinish = [_delegate respondsToSelector:@selector(videoPlayerNodePlaybackDidFinish:)]; + _delegateFlags.delegateVideoNodePlaybackDidFinish = [_delegate respondsToSelector:@selector(videoPlayerNodeDidPlayToEnd:)]; _delegateFlags.delegateVideoNodeShouldChangeState = [_delegate respondsToSelector:@selector(videoPlayerNode:shouldChangeVideoNodeStateTo:)]; _delegateFlags.delegateTimeLabelAttributedString = [_delegate respondsToSelector:@selector(videoPlayerNode:timeStringForTimeLabelType:forTime:)]; } } +- (void)setDisableControls:(BOOL)disableControls +{ + _disableControls = disableControls; + + if (_disableControls && _cachedControls.count > 0) { + [self removeControls]; + } else if (!_disableControls) { + [self createControls]; + } +} + #pragma mark - Helpers - (NSString *)timeStringForCMTime:(CMTime)time forTimeLabelType:(ASVideoPlayerNodeControlType)type { diff --git a/examples/ASDKTube/Sample/ViewController.m b/examples/ASDKTube/Sample/ViewController.m index 9b11e80f59..0e0e038fa6 100644 --- a/examples/ASDKTube/Sample/ViewController.m +++ b/examples/ASDKTube/Sample/ViewController.m @@ -45,6 +45,11 @@ _videoPlayerNode = [[ASVideoPlayerNode alloc] initWithUrl:fileUrl]; _videoPlayerNode.delegate = self; +// _videoPlayerNode.disableControls = YES; +// +// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ +// _videoPlayerNode.disableControls = NO; +// }); _videoPlayerNode.backgroundColor = [UIColor blackColor];