diff --git a/AsyncDisplayKit/ASDisplayNode.h b/AsyncDisplayKit/ASDisplayNode.h index 8923e41775..685ed93aef 100644 --- a/AsyncDisplayKit/ASDisplayNode.h +++ b/AsyncDisplayKit/ASDisplayNode.h @@ -660,6 +660,16 @@ NS_ASSUME_NONNULL_END - (BOOL)isFirstResponder; - (BOOL)canPerformAction:(nonnull SEL)action withSender:(nonnull id)sender; +#if TARGET_OS_TV +//Focus Engine +- (void)setNeedsFocusUpdate; +- (BOOL)canBecomeFocused; +- (void)updateFocusIfNeeded; +- (void)didUpdateFocusInContext:(nonnull UIFocusUpdateContext *)context withAnimationCoordinator:(nonnull UIFocusAnimationCoordinator *)coordinator; +- (BOOL)shouldUpdateFocusInContext:(nonnull UIFocusUpdateContext *)context; +- (nullable UIView *)preferredFocusedView; +#endif + // Accessibility support @property (atomic, assign) BOOL isAccessibilityElement; @property (nullable, atomic, copy) NSString *accessibilityLabel; diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 1346f7e910..e6e435ff5e 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -2312,6 +2312,38 @@ static void _recursivelySetDisplaySuspended(ASDisplayNode *node, CALayer *layer, return self; } +#if TARGET_OS_TV +#pragma mark - UIFocusEnvironment Protocol (tvOS) + +- (void)setNeedsFocusUpdate +{ + +} + +- (void)updateFocusIfNeeded +{ + +} + +- (BOOL)shouldUpdateFocusInContext:(UIFocusUpdateContext *)context +{ + return YES; +} + +- (void)didUpdateFocusInContext:(UIFocusUpdateContext *)context withAnimationCoordinator:(UIFocusAnimationCoordinator *)coordinator +{ + +} + +- (UIView *)preferredFocusedView +{ + if (self.nodeLoaded) { + return self.view; + } else { + return nil; + } +} +#endif @end @implementation ASDisplayNode (Debugging) diff --git a/AsyncDisplayKit/Details/_ASDisplayView.mm b/AsyncDisplayKit/Details/_ASDisplayView.mm index f542b29db6..25f92dc332 100644 --- a/AsyncDisplayKit/Details/_ASDisplayView.mm +++ b/AsyncDisplayKit/Details/_ASDisplayView.mm @@ -331,4 +331,36 @@ return _node; } +#if TARGET_OS_TV +#pragma mark - tvOS +- (BOOL)canBecomeFocused +{ + return [_node canBecomeFocused]; +} + +- (void)didUpdateFocusInContext:(UIFocusUpdateContext *)context withAnimationCoordinator:(UIFocusAnimationCoordinator *)coordinator +{ + return [_node didUpdateFocusInContext:context withAnimationCoordinator:coordinator]; +} + +- (void)setNeedsFocusUpdate +{ + return [_node setNeedsFocusUpdate]; +} + +- (void)updateFocusIfNeeded +{ + return [_node updateFocusIfNeeded]; +} + +- (BOOL)shouldUpdateFocusInContext:(UIFocusUpdateContext *)context +{ + return [_node shouldUpdateFocusInContext:context]; +} + +- (UIView *)preferredFocusedView +{ + return [_node preferredFocusedView]; +} +#endif @end diff --git a/AsyncDisplayKit/Private/ASDisplayNode+UIViewBridge.mm b/AsyncDisplayKit/Private/ASDisplayNode+UIViewBridge.mm index ec7a10b354..29e9b64af8 100644 --- a/AsyncDisplayKit/Private/ASDisplayNode+UIViewBridge.mm +++ b/AsyncDisplayKit/Private/ASDisplayNode+UIViewBridge.mm @@ -81,6 +81,46 @@ return YES; } +#if TARGET_OS_TV +// Focus Engine +- (BOOL)canBecomeFocused +{ + return YES; +} + +- (void)setNeedsFocusUpdate +{ + ASDisplayNodeAssertMainThread(); + [_view setNeedsFocusUpdate]; +} + +- (void)updateFocusIfNeeded +{ + ASDisplayNodeAssertMainThread(); + [_view updateFocusIfNeeded]; +} + +- (BOOL)shouldUpdateFocusInContext:(UIFocusUpdateContext *)context +{ + return YES; +} + +- (void)didUpdateFocusInContext:(UIFocusUpdateContext *)context withAnimationCoordinator:(UIFocusAnimationCoordinator *)coordinator +{ + +} + +- (UIView *)preferredFocusedView +{ + if (self.nodeLoaded) { + return _view; + } + else { + return nil; + } +} +#endif + - (BOOL)isFirstResponder { ASDisplayNodeAssertMainThread();