[tvOS] Added a default touch down animation for ASControlNode

This commit is contained in:
Aaron Schubert 2016-02-23 12:18:33 +00:00
parent 4ad6d91a10
commit d9cde1f08c
2 changed files with 99 additions and 64 deletions

View File

@ -30,6 +30,9 @@ typedef NS_OPTIONS(NSUInteger, ASControlNodeEvent)
ASControlNodeEventTouchUpOutside = 1 << 5, ASControlNodeEventTouchUpOutside = 1 << 5,
/** A system event canceling the current touches for the control node. */ /** A system event canceling the current touches for the control node. */
ASControlNodeEventTouchCancel = 1 << 6, ASControlNodeEventTouchCancel = 1 << 6,
/** A system event when the Play/Pause button on the Apple TV remote is pressed. */
ASControlNodeEventPrimaryActionTriggered = 1 << 13,
/** All events, including system events. */ /** All events, including system events. */
ASControlNodeEventAllEvents = 0xFFFFFFFF ASControlNodeEventAllEvents = 0xFFFFFFFF
}; };

View File

@ -82,12 +82,21 @@ void _ASEnumerateControlEventsIncludedInMaskWithBlock(ASControlNodeEvent mask, v
// As we have no targets yet, we start off with user interaction off. When a target is added, it'll get turned back on. // As we have no targets yet, we start off with user interaction off. When a target is added, it'll get turned back on.
self.userInteractionEnabled = NO; self.userInteractionEnabled = NO;
#if TARGET_OS_TV
[self addTarget:self action:@selector(updateUI) forControlEvents:ASControlNodeEventAllEvents];
#endif
return self; return self;
} }
- (void)didLoad
{
#if TARGET_OS_TV
// [self addTarget:self action:@selector(updateUI) forControlEvents:ASControlNodeEventPrimaryActionTriggered];
self.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGestureRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pressDown)];
tapGestureRec.allowedPressTypes = @[@(UIPressTypeSelect)];
[self.view addGestureRecognizer:tapGestureRec];
#endif
}
#pragma mark - ASDisplayNode Overrides #pragma mark - ASDisplayNode Overrides
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{ {
@ -153,6 +162,7 @@ void _ASEnumerateControlEventsIncludedInMaskWithBlock(ASControlNodeEvent mask, v
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{ {
NSLog(@"Touches Cancelled");
// If we're not interested in touches, we have nothing to do. // If we're not interested in touches, we have nothing to do.
if (!self.enabled) if (!self.enabled)
return; return;
@ -429,9 +439,17 @@ void _ASEnumerateControlEventsIncludedInMaskWithBlock(ASControlNodeEvent mask, v
} }
#if TARGET_OS_TV #if TARGET_OS_TV
#pragma mark - tvOS #pragma mark - tvOS
- (void)updateUI - (void)pressDown
{ {
NSLog(@"Update UI"); [UIView animateWithDuration:0.1 delay:0 options:UIViewAnimationCurveLinear animations:^{
[self setPressedState];
} completion:^(BOOL finished) {
if (finished) {
[UIView animateWithDuration:0.1 delay:0 options:UIViewAnimationCurveLinear animations:^{
[self setFocusedState];
} completion:nil];
}
}];
} }
- (BOOL)canBecomeFocused - (BOOL)canBecomeFocused
@ -446,33 +464,47 @@ void _ASEnumerateControlEventsIncludedInMaskWithBlock(ASControlNodeEvent mask, v
- (void)didUpdateFocusInContext:(UIFocusUpdateContext *)context withAnimationCoordinator:(UIFocusAnimationCoordinator *)coordinator - (void)didUpdateFocusInContext:(UIFocusUpdateContext *)context withAnimationCoordinator:(UIFocusAnimationCoordinator *)coordinator
{ {
NSLog(@"Focused");
if (context.nextFocusedView && context.nextFocusedView == self.view) { if (context.nextFocusedView && context.nextFocusedView == self.view) {
//Focused //Focused
[coordinator addCoordinatedAnimations:^{ [coordinator addCoordinatedAnimations:^{
[self setFocusedState];
} completion:nil];
} else{
//Not focused
[coordinator addCoordinatedAnimations:^{
[self setDefaultState];
} completion:nil];
}
}
- (void)setFocusedState
{
self.layer.shadowOffset = CGSizeMake(2, 10); self.layer.shadowOffset = CGSizeMake(2, 10);
self.layer.shadowColor = [UIColor blackColor].CGColor; self.layer.shadowColor = [UIColor blackColor].CGColor;
self.layer.shadowRadius = 12.0; self.layer.shadowRadius = 12.0;
self.layer.shadowOpacity = 0.45; self.layer.shadowOpacity = 0.45;
self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.layer.bounds].CGPath; self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.layer.bounds].CGPath;
self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1); self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1);
} completion:^{ }
}]; - (void)setPressedState
} else{ {
//Not focused self.layer.shadowOffset = CGSizeMake(2, 2);
[coordinator addCoordinatedAnimations:^{ self.layer.shadowColor = [UIColor blackColor].CGColor;
self.layer.shadowRadius = 12.0;
self.layer.shadowOpacity = 0.45;
self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.layer.bounds].CGPath;
self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1, 1);
}
- (void)setDefaultState
{
self.layer.shadowOffset = CGSizeZero; self.layer.shadowOffset = CGSizeZero;
self.layer.shadowColor = [UIColor blackColor].CGColor; self.layer.shadowColor = [UIColor blackColor].CGColor;
self.layer.shadowRadius = 0; self.layer.shadowRadius = 0;
self.layer.shadowOpacity = 0; self.layer.shadowOpacity = 0;
self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.layer.bounds].CGPath; self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.layer.bounds].CGPath;
self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1, 1); self.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1, 1);
} completion:^{
}];
}
} }
#endif #endif
@end @end