Objective c 使用循环计数时FLAnimatedImage多重gif播放延迟-目标c

Objective c 使用循环计数时FLAnimatedImage多重gif播放延迟-目标c,objective-c,animated-gif,Objective C,Animated Gif,我有一个UIPageViewController,它显示5个GIF,每页一个。 FLAnimatedImage工作得很好,只有一个缺点,没有设置动画循环,所以我用它来实现 但另一个问题发生在gif完成并在一个控制器中停止后,我移动到另一个控制器,然后返回到上一个控制器,gif将在延迟后启动 我不知道如何解决这个问题。FLAnimatedImages类中的所有延迟都与动画延迟相关,而不是与播放延迟相关 下面是从方法initWithAnimatedGIFData中的类FLAnimatedImage.

我有一个UIPageViewController,它显示5个GIF,每页一个。 FLAnimatedImage工作得很好,只有一个缺点,没有设置动画循环,所以我用它来实现

但另一个问题发生在gif完成并在一个控制器中停止后,我移动到另一个控制器,然后返回到上一个控制器,gif将在延迟后启动

我不知道如何解决这个问题。FLAnimatedImages类中的所有延迟都与动画延迟相关,而不是与播放延迟相关

下面是从方法
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将始终重新加载到内存中