Merge pull request #2873 from dreampiggy/bugfix_animated_image_macOS_pause_resume_speed

Fix the issue that SDAnimatedImageView on macOS will change the wrong duration speed when pause and resume again
This commit is contained in:
DreamPiggy 2019-10-27 04:39:53 +08:00 committed by GitHub
commit fc4497d4f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 5 additions and 7 deletions

View File

@ -580,7 +580,7 @@ static NSUInteger SDDeviceFreeMemory() {
}
#if SD_MAC
- (void)displayDidRefresh:(CVDisplayLinkRef)displayLink
- (void)displayDidRefresh:(CVDisplayLinkRef)displayLink duration:(NSTimeInterval)duration
#else
- (void)displayDidRefresh:(CADisplayLink *)displayLink
#endif
@ -591,11 +591,7 @@ static NSUInteger SDDeviceFreeMemory() {
return;
}
// Calculate refresh duration
#if SD_MAC
CVTimeStamp nowTime;
CVDisplayLinkGetCurrentTime(displayLink, &nowTime);
NSTimeInterval duration = (double)nowTime.videoRefreshPeriod / ((double)nowTime.videoTimeScale * nowTime.rateScalar);
#else
#if SD_UIKIT
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
NSTimeInterval duration = displayLink.duration * displayLink.frameInterval;
@ -793,11 +789,13 @@ static NSUInteger SDDeviceFreeMemory() {
#if SD_MAC
static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp *inNow, const CVTimeStamp *inOutputTime, CVOptionFlags flagsIn, CVOptionFlags *flagsOut, void *displayLinkContext) {
// Calculate refresh duration
NSTimeInterval duration = (double)inOutputTime->videoRefreshPeriod / ((double)inOutputTime->videoTimeScale * inOutputTime->rateScalar);
// CVDisplayLink callback is not on main queue
SDAnimatedImageView *imageView = (__bridge SDAnimatedImageView *)displayLinkContext;
__weak SDAnimatedImageView *weakImageView = imageView;
dispatch_async(dispatch_get_main_queue(), ^{
[weakImageView displayDidRefresh:displayLink];
[weakImageView displayDidRefresh:displayLink duration:duration];
});
return kCVReturnSuccess;
}