iOS: add animation callback for iOS
This commit is contained in:
parent
96e61e2268
commit
2d1cf3fcfe
@ -71,6 +71,7 @@ @implementation DoricImageView
|
|||||||
|
|
||||||
@interface DoricImageNode ()
|
@interface DoricImageNode ()
|
||||||
@property(nonatomic, copy) NSString *loadCallbackId;
|
@property(nonatomic, copy) NSString *loadCallbackId;
|
||||||
|
@property(nonatomic, copy) NSString *animationEndCallbackId;
|
||||||
@property(nonatomic, assign) UIViewContentMode contentMode;
|
@property(nonatomic, assign) UIViewContentMode contentMode;
|
||||||
@property(nonatomic, strong) NSNumber *placeHolderColor;
|
@property(nonatomic, strong) NSNumber *placeHolderColor;
|
||||||
@property(nonatomic, strong) NSString *placeHolderImage;
|
@property(nonatomic, strong) NSString *placeHolderImage;
|
||||||
@ -555,11 +556,53 @@ - (void)blendView:(UIImageView *)view forPropName:(NSString *)name propValue:(id
|
|||||||
self.stretchInsetDic = (NSDictionary *) prop;
|
self.stretchInsetDic = (NSDictionary *) prop;
|
||||||
} else if ([@"imageScale" isEqualToString:name]) {
|
} else if ([@"imageScale" isEqualToString:name]) {
|
||||||
//Do not need set
|
//Do not need set
|
||||||
|
} else if ([@"onAnimationEnd" isEqualToString:name]) {
|
||||||
|
self.animationEndCallbackId = prop;
|
||||||
|
DoricImageView *doricImageView = (DoricImageView *) view;
|
||||||
|
#if DORIC_USE_YYWEBIMAGE
|
||||||
|
[doricImageView addObserver:self
|
||||||
|
forKeyPath:@"currentIsPlayingAnimation"
|
||||||
|
options:NSKeyValueObservingOptionOld
|
||||||
|
context:nil];
|
||||||
|
#elif DORIC_USE_SDWEBIMAGE
|
||||||
|
[doricImageView addObserver:self
|
||||||
|
forKeyPath:@"currentFrameIndex"
|
||||||
|
options:NSKeyValueObservingOptionNew
|
||||||
|
context:nil];
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
[super blendView:view forPropName:name propValue:prop];
|
[super blendView:view forPropName:name propValue:prop];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey, id> *)change context:(void *)context {
|
||||||
|
DoricImageView *doricImageView = (DoricImageView *) self.view;
|
||||||
|
#if DORIC_USE_YYWEBIMAGE
|
||||||
|
if ([keyPath isEqualToString:@"currentIsPlayingAnimation"]) {
|
||||||
|
if (!self.animationEndCallbackId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!doricImageView.currentIsPlayingAnimation
|
||||||
|
&& [change[@"old"] boolValue]) {
|
||||||
|
[self callJSResponse:self.animationEndCallbackId, nil];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#elif DORIC_USE_SDWEBIMAGE
|
||||||
|
if ([keyPath isEqualToString:@"currentFrameIndex"]) {
|
||||||
|
if (!self.animationEndCallbackId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SDAnimatedImagePlayer *player = doricImageView.player;
|
||||||
|
if (player.totalLoopCount > 0
|
||||||
|
&& player.currentLoopCount == player.totalLoopCount - 1
|
||||||
|
&& player.currentFrameIndex == player.totalFrameCount - 1
|
||||||
|
) {
|
||||||
|
[self callJSResponse:self.animationEndCallbackId, nil];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
- (UIImage *)imageNamed:(NSString *)name {
|
- (UIImage *)imageNamed:(NSString *)name {
|
||||||
#if DORIC_USE_YYWEBIMAGE
|
#if DORIC_USE_YYWEBIMAGE
|
||||||
YYImage *image = [YYImage imageNamed:name];
|
YYImage *image = [YYImage imageNamed:name];
|
||||||
@ -611,7 +654,7 @@ - (NSNumber *)isAnimating {
|
|||||||
|
|
||||||
- (void)startAnimating {
|
- (void)startAnimating {
|
||||||
#if DORIC_USE_YYWEBIMAGE
|
#if DORIC_USE_YYWEBIMAGE
|
||||||
[(DoricImageView *)self.view setCurrentAnimatedImageIndex:0];
|
[(DoricImageView *) self.view setCurrentAnimatedImageIndex:0];
|
||||||
#endif
|
#endif
|
||||||
[self.view startAnimating];
|
[self.view startAnimating];
|
||||||
}
|
}
|
||||||
@ -645,4 +688,12 @@ - (BOOL)needReload {
|
|||||||
}
|
}
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)dealloc {
|
||||||
|
#if DORIC_USE_YYWEBIMAGE
|
||||||
|
[(DoricImageView *) self.view removeObserver:self forKeyPath:@"currentIsPlayingAnimation" context:nil];
|
||||||
|
#elif DORIC_USE_SDWEBIMAGE
|
||||||
|
[(DoricImageView *) self.view removeObserver:self forKeyPath:@"currentFrameIndex" context:nil];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
@end
|
@end
|
||||||
|
Reference in New Issue
Block a user