From 2d1499ab4f623e796b4fc09af904d35e15e40105 Mon Sep 17 00:00:00 2001 From: Luke Parham Date: Fri, 29 Jan 2016 09:27:48 -0800 Subject: [PATCH] added muting property and delegate callback to override video tapping --- AsyncDisplayKit.xcodeproj/project.pbxproj | 16 +++++++++ AsyncDisplayKit/ASVideoNode.h | 3 ++ AsyncDisplayKit/ASVideoNode.mm | 36 ++++++++++++++++--- AsyncDisplayKit/Private/ASDefaultPlayButton.m | 1 - examples/Videos/Sample/ViewController.m | 14 ++++++-- 5 files changed, 61 insertions(+), 9 deletions(-) diff --git a/AsyncDisplayKit.xcodeproj/project.pbxproj b/AsyncDisplayKit.xcodeproj/project.pbxproj index fe19c59286..b67b61efc3 100644 --- a/AsyncDisplayKit.xcodeproj/project.pbxproj +++ b/AsyncDisplayKit.xcodeproj/project.pbxproj @@ -1616,6 +1616,7 @@ 058D09B9195D04C000B7D73C /* Frameworks */, 058D09BA195D04C000B7D73C /* Resources */, 3B9D88CDF51B429C8409E4B6 /* Copy Pods Resources */, + FB42E06CF915B60406431170 /* Embed Pods Frameworks */, ); buildRules = ( ); @@ -1745,6 +1746,21 @@ shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AsyncDisplayKitTests/Pods-AsyncDisplayKitTests-resources.sh\"\n"; showEnvVarsInLog = 0; }; + FB42E06CF915B60406431170 /* Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AsyncDisplayKitTests/Pods-AsyncDisplayKitTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ diff --git a/AsyncDisplayKit/ASVideoNode.h b/AsyncDisplayKit/ASVideoNode.h index 7df171d005..515dc20f4b 100644 --- a/AsyncDisplayKit/ASVideoNode.h +++ b/AsyncDisplayKit/ASVideoNode.h @@ -24,6 +24,8 @@ @property (nonatomic, assign, readwrite) BOOL shouldAutoplay; @property (nonatomic, assign, readwrite) BOOL shouldAutorepeat; +@property (nonatomic, assign, readwrite) BOOL muted; + @property (atomic) NSString *gravity; @property (atomic) ASButtonNode *playButton; @@ -39,5 +41,6 @@ @protocol ASVideoNodeDelegate @optional - (void)videoPlaybackDidFinish:(ASVideoNode *)videoNode; +- (void)videoNodeWasTapped:(ASVideoNode *)videoNode; @end diff --git a/AsyncDisplayKit/ASVideoNode.mm b/AsyncDisplayKit/ASVideoNode.mm index f6f717f452..6ba344d35a 100644 --- a/AsyncDisplayKit/ASVideoNode.mm +++ b/AsyncDisplayKit/ASVideoNode.mm @@ -19,6 +19,8 @@ BOOL _shouldAutorepeat; BOOL _shouldAutoplay; + + BOOL _muted; AVAsset *_asset; @@ -31,6 +33,7 @@ ASDisplayNode *_playerNode; ASDisplayNode *_spinner; NSString *_gravity; + dispatch_queue_t _previewQueue; } @@ -137,6 +140,7 @@ AVPlayerLayer *playerLayer = [[AVPlayerLayer alloc] init]; if (!_player) { _player = [AVPlayer playerWithPlayerItem:[[AVPlayerItem alloc] initWithAsset:_asset]]; + _player.muted = _muted; } playerLayer.player = _player; playerLayer.videoGravity = [self gravity]; @@ -176,10 +180,14 @@ - (void)tapped { - if (_shouldBePlaying) { - [self pause]; + if (self.delegate && [self.delegate respondsToSelector:@selector(videoNodeWasTapped:)]) { + [self.delegate videoNodeWasTapped:self]; } else { - [self play]; + if (_shouldBePlaying) { + [self pause]; + } else { + [self play]; + } } } @@ -209,11 +217,11 @@ [_player replaceCurrentItemWithPlayerItem:_currentItem]; } else { _player = [[AVPlayer alloc] initWithPlayerItem:_currentItem]; + _player.muted = _muted; } } } - - (void)clearFetchedData { [super clearFetchedData]; @@ -231,11 +239,14 @@ if (_shouldAutoplay && _playerNode.isNodeLoaded) { [self play]; + } else if (_shouldAutoplay) { + _shouldBePlaying = YES; } if (isVisible) { if (_playerNode.isNodeLoaded) { if (!_player) { _player = [AVPlayer playerWithPlayerItem:[[AVPlayerItem alloc] initWithAsset:_asset]]; + _player.muted = _muted; } ((AVPlayerLayer *)_playerNode.layer).player = _player; } @@ -256,7 +267,7 @@ [self addSubnode:playButton]; - [_playButton addTarget:self action:@selector(play) forControlEvents:ASControlNodeEventTouchUpInside]; + [_playButton addTarget:self action:@selector(tapped) forControlEvents:ASControlNodeEventTouchUpInside]; } - (ASButtonNode *)playButton @@ -310,6 +321,20 @@ return _gravity; } +- (BOOL)muted +{ + ASDN::MutexLocker l(_lock); + + return _muted; +} + +- (void)setMuted:(BOOL)muted +{ + ASDN::MutexLocker l(_lock); + + _muted = muted; +} + #pragma mark - Video Playback - (void)play @@ -330,6 +355,7 @@ AVPlayerLayer *playerLayer = [[AVPlayerLayer alloc] init]; if (!_player) { _player = [AVPlayer playerWithPlayerItem:[[AVPlayerItem alloc] initWithAsset:_asset]]; + _player.muted = _muted; } playerLayer.player = _player; playerLayer.videoGravity = [self gravity]; diff --git a/AsyncDisplayKit/Private/ASDefaultPlayButton.m b/AsyncDisplayKit/Private/ASDefaultPlayButton.m index 7cf9f6d49f..364b86a6e5 100644 --- a/AsyncDisplayKit/Private/ASDefaultPlayButton.m +++ b/AsyncDisplayKit/Private/ASDefaultPlayButton.m @@ -44,7 +44,6 @@ // Circle Drawing UIBezierPath *ovalPath = [UIBezierPath bezierPathWithOvalInRect: buttonBounds]; [[UIColor colorWithWhite:0.0 alpha:0.5] setFill]; - [ovalPath stroke]; [ovalPath fill]; // Triangle Drawing diff --git a/examples/Videos/Sample/ViewController.m b/examples/Videos/Sample/ViewController.m index d36c928ead..5c4c0488ef 100644 --- a/examples/Videos/Sample/ViewController.m +++ b/examples/Videos/Sample/ViewController.m @@ -43,7 +43,6 @@ videoNode.backgroundColor = [UIColor lightGrayColor]; -// videoNode.playButton = [self playButton]; return videoNode; } @@ -61,7 +60,8 @@ nicCageVideo.backgroundColor = [UIColor lightGrayColor]; nicCageVideo.shouldAutorepeat = YES; -// nicCageVideo.playButton = [self playButton]; + nicCageVideo.shouldAutoplay = YES; + nicCageVideo.muted = YES; return nicCageVideo; } @@ -79,7 +79,6 @@ simonVideo.backgroundColor = [UIColor lightGrayColor]; simonVideo.shouldAutorepeat = YES; -// simonVideo.playButton = [self playButton]; simonVideo.shouldAutoplay = YES; return simonVideo; @@ -99,6 +98,15 @@ return playButton; } +- (void)videoNodeWasTapped:(ASVideoNode *)videoNode +{ + if (videoNode.player.muted == YES) { + videoNode.player.muted = NO; + } else { + videoNode.player.muted = YES; + } +} + - (BOOL)prefersStatusBarHidden { return YES;