Objective c 使用循环计数时FLAnimatedImage多重gif播放延迟-目标c
我有一个UIPageViewController,它显示5个GIF,每页一个。 FLAnimatedImage工作得很好,只有一个缺点,没有设置动画循环,所以我用它来实现 但另一个问题发生在gif完成并在一个控制器中停止后,我移动到另一个控制器,然后返回到上一个控制器,gif将在延迟后启动 我不知道如何解决这个问题。FLAnimatedImages类中的所有延迟都与动画延迟相关,而不是与播放延迟相关 下面是从方法Objective c 使用循环计数时FLAnimatedImage多重gif播放延迟-目标c,objective-c,animated-gif,Objective C,Animated Gif,我有一个UIPageViewController,它显示5个GIF,每页一个。 FLAnimatedImage工作得很好,只有一个缺点,没有设置动画循环,所以我用它来实现 但另一个问题发生在gif完成并在一个控制器中停止后,我移动到另一个控制器,然后返回到上一个控制器,gif将在延迟后启动 我不知道如何解决这个问题。FLAnimatedImages类中的所有延迟都与动画延迟相关,而不是与播放延迟相关 下面是从方法initWithAnimatedGIFData中的类FLAnimatedImage.
initWithAnimatedGIFData
中的类FLAnimatedImage.m中提取的:
// Try to use the unclamped delay time; fall back to the normal delay time.
NSNumber *delayTime = [framePropertiesGIF objectForKey:(id)kCGImagePropertyGIFUnclampedDelayTime];
if (!delayTime) {
delayTime = [framePropertiesGIF objectForKey:(id)kCGImagePropertyGIFDelayTime];
}
// If we don't get a delay time from the properties, fall back to `kDelayTimeIntervalDefault` or carry over the preceding frame's value.
const NSTimeInterval kDelayTimeIntervalDefault = 0.1;
if (!delayTime) {
if (i == 0) {
FLLogInfo(@"Falling back to default delay time for first frame %@ because none found in GIF properties %@", frameImage, frameProperties);
delayTime = @(kDelayTimeIntervalDefault);
} else {
FLLogInfo(@"Falling back to preceding delay time for frame %zu %@ because none found in GIF properties %@", i, frameImage, frameProperties);
delayTime = delayTimesMutable[i - 1];
}
}
// Support frame delays as low as `kDelayTimeIntervalMinimum`, with anything below being rounded up to `kDelayTimeIntervalDefault` for legacy compatibility.
// This is how the fastest browsers do it as per 2012: http://nullsleep.tumblr.com/post/16524517190/animated-gif-minimum-frame-delay-browser-compatibility
const NSTimeInterval kDelayTimeIntervalMinimum = 0.02;
// To support the minimum even when rounding errors occur, use an epsilon when comparing. We downcast to float because that's what we get for delayTime from ImageIO.
if ([delayTime floatValue] < ((float)kDelayTimeIntervalMinimum - FLT_EPSILON)) {
FLLogInfo(@"Rounding frame %zu's `delayTime` from %f up to default %f (minimum supported: %f).", i, [delayTime floatValue], kDelayTimeIntervalDefault, kDelayTimeIntervalMinimum);
delayTime = @(kDelayTimeIntervalDefault);
}
delayTimesMutable[i] = delayTime;
} else {
FLLogInfo(@"Dropping frame %zu because valid `CGImageRef` %@ did result in `nil`-`UIImage`.", i, frameImageRef);
}
CFRelease(frameImageRef);
} else {
FLLogInfo(@"Dropping frame %zu because failed to `CGImageSourceCreateImageAtIndex` with image source %@", i, _imageSource);
}
}
_delayTimes = [delayTimesMutable copy];
_frameCount = [_delayTimes count];
//尝试使用无夹持延迟时间;返回到正常的延迟时间。
NSNumber*delayTime=[framePropertiesGIF objectForKey:(id)kCGImagePropertyGIFUnclampedDelayTime];
如果(!延迟时间){
delayTime=[framePropertiesGIF objectForKey:(id)kCGImagePropertyGIFDelayTime];
}
//如果我们没有从属性中获得延迟时间,请返回“kDelayTimeIntervalDefault”或将前一帧的值带入。
const NSTimeInterval kDelayTimeIntervalDefault=0.1;
如果(!延迟时间){
如果(i==0){
FLLogInfo(@“返回到第一帧%@的默认延迟时间,因为在GIF属性%@”、frameImage、frameProperties中找不到延迟时间);
delayTime=@(kDelayTimeIntervalDefault);
}否则{
FLLogInfo(@“帧%zu%@返回到之前的延迟时间,因为在GIF属性%@”、i、frameImage、frameProperties中找不到延迟时间);
delayTime=delayTimesMutable[i-1];
}
}
//支持低至“kdelayimeintervalminimum”的帧延迟,以下任何内容都将向上取整为“kdelayimeintervaldefault”,以实现旧式兼容性。
//这是最快的浏览器在2012年的表现:http://nullsleep.tumblr.com/post/16524517190/animated-gif-minimum-frame-delay-browser-compatibility
常数NtimeInterval kDelayTimeIntervalMinimum=0.02;
//要支持最小值(即使在出现舍入错误时),请在比较时使用ε。我们向下倾斜到浮动,因为这是我们从ImageIO获得的延迟时间。
如果([delayTime floatValue]<((float)kDelayTimeIntervalMinimum-FLT_EPSILON)){
FLLogInfo(@“将帧%zu的'delayTime'从%f取整到默认值%f(支持的最小值:%f)”,i、[delayTime floatValue]、kDelayTimeIntervalDefault、kDelayTimeIntervalMinimum);
delayTime=@(kDelayTimeIntervalDefault);
}
delayTimesMutable[i]=延迟时间;
}否则{
FLLogInfo(@“正在删除帧%zu,因为有效的`CGImageRef`%@确实导致`nil`-`UIImage`.”,i,frameImageRef);
}
CFRelease(frameImageRef);
}否则{
FLLogInfo(@“由于未能使用图像源%@`CGImageSourceCreateImageAtIndex`而丢弃帧%zu”,i,_imageSource);
}
}
_delayTimes=[delayTimesMutable copy];
_帧数=[[u延迟次数计数];
解决方案是将UIPageController转换样式更改为curl而不是scroll,因此将始终创建页面内容控制器的新实例,并且GIF将始终重新加载到内存中