|
15 | 15 | #import "SDInternalMacros.h"
|
16 | 16 | #import "objc/runtime.h"
|
17 | 17 |
|
| 18 | +// A wrapper to implements the transformer on animated image, like tint color |
| 19 | +@interface SDAnimatedImageFrameProvider : NSObject <SDAnimatedImageProvider> |
| 20 | +@property (nonatomic, strong) id<SDAnimatedImageProvider> provider; |
| 21 | +@property (nonatomic, strong) id<SDImageTransformer> transformer; |
| 22 | +@end |
| 23 | + |
| 24 | +@implementation SDAnimatedImageFrameProvider |
| 25 | + |
| 26 | +- (instancetype)initWithProvider:(id<SDAnimatedImageProvider>)provider transformer:(id<SDImageTransformer>)transformer { |
| 27 | + self = [super init]; |
| 28 | + if (self) { |
| 29 | + _provider = provider; |
| 30 | + _transformer = transformer; |
| 31 | + } |
| 32 | + return self; |
| 33 | +} |
| 34 | + |
| 35 | +- (NSUInteger)hash { |
| 36 | + NSUInteger prime = 31; |
| 37 | + NSUInteger result = 1; |
| 38 | + NSUInteger providerHash = self.provider.hash; |
| 39 | + NSUInteger transformerHash = self.transformer.transformerKey.hash; |
| 40 | + result = prime * result + providerHash; |
| 41 | + result = prime * result + transformerHash; |
| 42 | + return result; |
| 43 | +} |
| 44 | + |
| 45 | +- (BOOL)isEqual:(id)object { |
| 46 | + if (nil == object) { |
| 47 | + return NO; |
| 48 | + } |
| 49 | + if (self == object) { |
| 50 | + return YES; |
| 51 | + } |
| 52 | + if (![object isKindOfClass:[self class]]) { |
| 53 | + return NO; |
| 54 | + } |
| 55 | + return self.provider == [object provider] |
| 56 | + && [self.transformer.transformerKey isEqualToString:[object transformer].transformerKey]; |
| 57 | +} |
| 58 | + |
| 59 | +- (NSData *)animatedImageData { |
| 60 | + return self.provider.animatedImageData; |
| 61 | +} |
| 62 | + |
| 63 | +- (NSUInteger)animatedImageFrameCount { |
| 64 | + return self.provider.animatedImageFrameCount; |
| 65 | +} |
| 66 | + |
| 67 | +- (NSUInteger)animatedImageLoopCount { |
| 68 | + return self.provider.animatedImageLoopCount; |
| 69 | +} |
| 70 | + |
| 71 | +- (NSTimeInterval)animatedImageDurationAtIndex:(NSUInteger)index { |
| 72 | + return [self.provider animatedImageDurationAtIndex:index]; |
| 73 | +} |
| 74 | + |
| 75 | +- (UIImage *)animatedImageFrameAtIndex:(NSUInteger)index { |
| 76 | + UIImage *frame = [self.provider animatedImageFrameAtIndex:index]; |
| 77 | + return [self.transformer transformedImageWithImage:frame forKey:@""]; |
| 78 | +} |
| 79 | + |
| 80 | +@end |
| 81 | + |
18 | 82 | @interface UIImageView () <CALayerDelegate>
|
19 | 83 | @end
|
20 | 84 |
|
@@ -139,7 +203,14 @@ - (void)setImage:(UIImage *)image
|
139 | 203 | provider = (id<SDAnimatedImage>)image;
|
140 | 204 | }
|
141 | 205 | // Create animated player
|
142 |
| - self.player = [SDAnimatedImagePlayer playerWithProvider:provider]; |
| 206 | + if (self.animationTransformer) { |
| 207 | + // Check if post-transform animation available |
| 208 | + provider = [[SDAnimatedImageFrameProvider alloc] initWithProvider:provider transformer:self.animationTransformer]; |
| 209 | + self.player = [SDAnimatedImagePlayer playerWithProvider:provider]; |
| 210 | + } else { |
| 211 | + // Normal animation without post-transform |
| 212 | + self.player = [SDAnimatedImagePlayer playerWithProvider:provider]; |
| 213 | + } |
143 | 214 | } else {
|
144 | 215 | // Update Frame Count
|
145 | 216 | self.player.totalFrameCount = [(id<SDAnimatedImage>)image animatedImageFrameCount];
|
|
0 commit comments