diff --git a/CHANGELOG.md b/CHANGELOG.md index ef7a088d1e..d326bdc5b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## master * Add your own contributions to the next release on the line below this with your name. +- Fixed an issue where GIFs with placeholders never had their placeholders uncover the GIF. [Garrett Moon](https://github.com/garrettmoon) - [Yoga] Implement ASYogaLayoutSpec, a simplified integration strategy for Yoga-powered layout calculation. [Scott Goodson](https://github.com/appleguy) - Fixed an issue where calls to setNeedsDisplay and setNeedsLayout would stop working on loaded nodes. [Garrett Moon](https://github.com/garrettmoon) - [ASTextKitFontSizeAdjuster] [Ricky Cancro] Replace use of NSAttributedString's boundingRectWithSize:options:context: with NSLayoutManager's boundingRectForGlyphRange:inTextContainer: diff --git a/Source/ASImageNode+AnimatedImage.mm b/Source/ASImageNode+AnimatedImage.mm index 52a6182249..0ff21c4b4b 100644 --- a/Source/ASImageNode+AnimatedImage.mm +++ b/Source/ASImageNode+AnimatedImage.mm @@ -53,6 +53,7 @@ NSString *const ASAnimatedImageDefaultRunLoopMode = NSRunLoopCommonModes; return; } + id previousAnimatedImage = _animatedImage; _animatedImage = animatedImage; if (animatedImage != nil) { @@ -73,6 +74,13 @@ NSString *const ASAnimatedImageDefaultRunLoopMode = NSRunLoopCommonModes; }; } } + + [self animatedImageSet:_animatedImage previousAnimatedImage:previousAnimatedImage]; +} + +- (void)animatedImageSet:(id )newAnimatedImage previousAnimatedImage:(id )previousAnimatedImage +{ + //Subclasses may override } - (id )animatedImage @@ -301,6 +309,7 @@ NSString *const ASAnimatedImageDefaultRunLoopMode = NSRunLoopCommonModes; self.lastDisplayLinkFire = 0; } else { self.contents = (__bridge id)frameImage; + [self displayDidFinish]; } } diff --git a/Source/ASImageNode.h b/Source/ASImageNode.h index 7ed80379be..547044c7d2 100644 --- a/Source/ASImageNode.h +++ b/Source/ASImageNode.h @@ -148,6 +148,9 @@ typedef UIImage * _Nullable (^asimagenode_modification_block_t)(UIImage *image); * * @discussion Set this to an object which conforms to ASAnimatedImageProtocol * to have the ASImageNode playback an animated image. + * @warning this method should not be overridden, it may not always be called as + * another method is used internally. If you need to know when the animatedImage + * is set, override @c animatedImageSet:previousAnimatedImage: */ @property (nullable, nonatomic, strong) id animatedImage; @@ -168,6 +171,15 @@ typedef UIImage * _Nullable (^asimagenode_modification_block_t)(UIImage *image); */ @property (nonatomic, strong) NSString *animatedImageRunLoopMode; +/** + * @abstract Method called when animated image has been set + * + * @discussion This method is for subclasses to override so they can know if an animated image + * has been set on the node. + * @warning this method is called with the node's lock held. + */ +- (void)animatedImageSet:(id )newAnimatedImage previousAnimatedImage:(id )previousAnimatedImage; + @end @interface ASImageNode (Unavailable) diff --git a/Source/ASMultiplexImageNode.mm b/Source/ASMultiplexImageNode.mm index af34cfa383..4a2a134043 100644 --- a/Source/ASMultiplexImageNode.mm +++ b/Source/ASMultiplexImageNode.mm @@ -257,7 +257,7 @@ typedef void(^ASMultiplexImageLoadCompletionBlock)(UIImage *image, id imageIdent - (BOOL)placeholderShouldPersist { - return (self.image == nil && self.imageIdentifiers.count > 0); + return (self.image == nil && self.animatedImage == nil && self.imageIdentifiers.count > 0); } /* displayWillStart in ASNetworkImageNode has a very similar implementation. Changes here are likely necessary diff --git a/Source/ASNetworkImageNode.mm b/Source/ASNetworkImageNode.mm index 0d96ff7573..d462c3836e 100755 --- a/Source/ASNetworkImageNode.mm +++ b/Source/ASNetworkImageNode.mm @@ -309,7 +309,7 @@ static const CGSize kMinReleaseImageOnBackgroundSize = {20.0, 20.0}; - (BOOL)placeholderShouldPersist { ASDN::MutexLocker l(__instanceLock__); - return (self.image == nil && _URL != nil); + return (self.image == nil && self.animatedImage == nil && _URL != nil); } /* displayWillStart in ASMultiplexImageNode has a very similar implementation. Changes here are likely necessary