From 7d7e4262ae48bd7cb9b65b298a4caae41624da8c Mon Sep 17 00:00:00 2001 From: Kyle Hickinson Date: Sun, 16 Nov 2014 11:58:01 -0500 Subject: [PATCH] Text node highlights fully fade in before fading out --- AsyncDisplayKit/ASTextNode.mm | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/AsyncDisplayKit/ASTextNode.mm b/AsyncDisplayKit/ASTextNode.mm index 3243401370..c017eda023 100644 --- a/AsyncDisplayKit/ASTextNode.mm +++ b/AsyncDisplayKit/ASTextNode.mm @@ -520,12 +520,24 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f) weakHighlightLayer.opacity = 0.0; + CFTimeInterval beginTime = CACurrentMediaTime(); + CABasicAnimation *possibleFadeIn = (CABasicAnimation *)[weakHighlightLayer animationForKey:@"opacity"]; + if (possibleFadeIn) { + // Calculate when we should begin fading out based on the end of the fade in animation, + // Also check to make sure that the new begin time hasn't already passed + CGFloat newBeginTime = (possibleFadeIn.beginTime + possibleFadeIn.duration); + if (newBeginTime > beginTime) { + beginTime = newBeginTime; + } + } + CABasicAnimation *fadeOut = [CABasicAnimation animationWithKeyPath:@"opacity"]; fadeOut.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; - fadeOut.fromValue = @(((CALayer *)weakHighlightLayer.presentationLayer).opacity); + fadeOut.fromValue = possibleFadeIn.toValue ?: @(((CALayer *)weakHighlightLayer.presentationLayer).opacity); fadeOut.toValue = @0.0; fadeOut.fillMode = kCAFillModeBoth; fadeOut.duration = ASTextNodeHighlightFadeOutDuration; + fadeOut.beginTime = beginTime; dispatch_block_t prev = [CATransaction completionBlock]; [CATransaction setCompletionBlock:^{ @@ -562,7 +574,6 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f) // Offset highlight rects to avoid double-counting target layer's bounds.origin. highlightedRect.origin.x -= highlightTargetLayer.bounds.origin.x; highlightedRect.origin.y -= highlightTargetLayer.bounds.origin.y; - [converted addObject:[NSValue valueWithCGRect:highlightedRect]]; } @@ -578,6 +589,7 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f) fadeIn.fromValue = @0.0; fadeIn.toValue = @(overlayLayer.opacity); fadeIn.duration = ASTextNodeHighlightFadeInDuration; + fadeIn.beginTime = CACurrentMediaTime(); [overlayLayer addAnimation:fadeIn forKey:fadeIn.keyPath]; }