|
|
@@ -15,6 +15,70 @@
|
|
|
#import "SDInternalMacros.h"
|
|
|
#import "objc/runtime.h"
|
|
|
|
|
|
+// A wrapper to implements the transformer on animated image, like tint color
|
|
|
+@interface SDAnimatedImageFrameProvider : NSObject <SDAnimatedImageProvider>
|
|
|
+@property (nonatomic, strong) id<SDAnimatedImageProvider> provider;
|
|
|
+@property (nonatomic, strong) id<SDImageTransformer> transformer;
|
|
|
+@end
|
|
|
+
|
|
|
+@implementation SDAnimatedImageFrameProvider
|
|
|
+
|
|
|
+- (instancetype)initWithProvider:(id<SDAnimatedImageProvider>)provider transformer:(id<SDImageTransformer>)transformer {
|
|
|
+ self = [super init];
|
|
|
+ if (self) {
|
|
|
+ _provider = provider;
|
|
|
+ _transformer = transformer;
|
|
|
+ }
|
|
|
+ return self;
|
|
|
+}
|
|
|
+
|
|
|
+- (NSUInteger)hash {
|
|
|
+ NSUInteger prime = 31;
|
|
|
+ NSUInteger result = 1;
|
|
|
+ NSUInteger providerHash = self.provider.hash;
|
|
|
+ NSUInteger transformerHash = self.transformer.transformerKey.hash;
|
|
|
+ result = prime * result + providerHash;
|
|
|
+ result = prime * result + transformerHash;
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+- (BOOL)isEqual:(id)object {
|
|
|
+ if (nil == object) {
|
|
|
+ return NO;
|
|
|
+ }
|
|
|
+ if (self == object) {
|
|
|
+ return YES;
|
|
|
+ }
|
|
|
+ if (![object isKindOfClass:[self class]]) {
|
|
|
+ return NO;
|
|
|
+ }
|
|
|
+ return self.provider == [object provider]
|
|
|
+ && [self.transformer.transformerKey isEqualToString:[object transformer].transformerKey];
|
|
|
+}
|
|
|
+
|
|
|
+- (NSData *)animatedImageData {
|
|
|
+ return self.provider.animatedImageData;
|
|
|
+}
|
|
|
+
|
|
|
+- (NSUInteger)animatedImageFrameCount {
|
|
|
+ return self.provider.animatedImageFrameCount;
|
|
|
+}
|
|
|
+
|
|
|
+- (NSUInteger)animatedImageLoopCount {
|
|
|
+ return self.provider.animatedImageLoopCount;
|
|
|
+}
|
|
|
+
|
|
|
+- (NSTimeInterval)animatedImageDurationAtIndex:(NSUInteger)index {
|
|
|
+ return [self.provider animatedImageDurationAtIndex:index];
|
|
|
+}
|
|
|
+
|
|
|
+- (UIImage *)animatedImageFrameAtIndex:(NSUInteger)index {
|
|
|
+ UIImage *frame = [self.provider animatedImageFrameAtIndex:index];
|
|
|
+ return [self.transformer transformedImageWithImage:frame forKey:@""];
|
|
|
+}
|
|
|
+
|
|
|
+@end
|
|
|
+
|
|
|
@interface UIImageView () <CALayerDelegate>
|
|
|
@end
|
|
|
|
|
|
@@ -139,7 +203,14 @@
|
|
|
provider = (id<SDAnimatedImage>)image;
|
|
|
}
|
|
|
// Create animated player
|
|
|
- self.player = [SDAnimatedImagePlayer playerWithProvider:provider];
|
|
|
+ if (self.animationTransformer) {
|
|
|
+ // Check if post-transform animation available
|
|
|
+ provider = [[SDAnimatedImageFrameProvider alloc] initWithProvider:provider transformer:self.animationTransformer];
|
|
|
+ self.player = [SDAnimatedImagePlayer playerWithProvider:provider];
|
|
|
+ } else {
|
|
|
+ // Normal animation without post-transform
|
|
|
+ self.player = [SDAnimatedImagePlayer playerWithProvider:provider];
|
|
|
+ }
|
|
|
} else {
|
|
|
// Update Frame Count
|
|
|
self.player.totalFrameCount = [(id<SDAnimatedImage>)image animatedImageFrameCount];
|