YYImage의 YYFrameImage

2332 단어
YYFrameImage는 이미지 세트를 그룹화한 동적 이미지 객체를 나타냅니다.우선 초기화 방법을 살펴보자.YYFrameImage는 두 가지 초기화 방법이 있습니다.
- (instancetype)initWithImagePaths:(NSArray *)paths frameDurations:(NSArray *)frameDurations loopCount:(NSUInteger)loopCount

- (instancetype)initWithImageDataArray:(NSArray *)dataArray frameDurations:(NSArray *)frameDurations loopCount:(NSUInteger)loopCount


구조가 간단하고 한 조의 그림의 path나 데이터로 여러 개의 그림을 봉하여 YYAnimatedImageView에서 재생하는 목적을 달성한다.
내부에서도 몇 개의 구성원 변수를 유지했다
NSUInteger _loopCount;
NSUInteger _oneFrameBytes;
NSArray *_imagePaths;
NSArray *_imageDatas;
NSArray *_frameDurations;

각각 순환 횟수, 여러 개의 그림 path 또는 여러 개의 그림 데이터, 그리고 매 프레임의 재생 시간의 수조입니다.
YYAnimatedImageView에서 재생하기 위해서는 YYAnimatedImage 프로토콜이 필요합니다. 여러 그림이 어떻게 조합되는지 살펴보겠습니다.
먼저 YYAnimatedImageView에서 재생할 수 있는 프레임의 개수를 알려줍니다.
- (NSUInteger)animatedImageFrameCount {
    if (_imagePaths) {
        return _imagePaths.count;
    } else if (_imageDatas) {
        return _imageDatas.count;
    } else {
        return 1;
    }
}


이후 순환 횟수 제공
- (NSUInteger)animatedImageLoopCount {
    return _loopCount;
}

그림의 최적화를 위해 각 프레임의 크기를 제공합니다
- (NSUInteger)animatedImageBytesPerFrame {
    return _oneFrameBytes;
}

매 프레임의 그림을 되돌려줍니다
- (UIImage *)animatedImageFrameAtIndex:(NSUInteger)index {
    if (_imagePaths) {
        if (index >= _imagePaths.count) return nil;
        NSString *path = _imagePaths[index];
        CGFloat scale = _NSStringPathScale(path);
        NSData *data = [NSData dataWithContentsOfFile:path];
        return [[UIImage imageWithData:data scale:scale] yy_imageByDecoded];
    } else if (_imageDatas) {
        if (index >= _imageDatas.count) return nil;
        NSData *data = _imageDatas[index];
        return [[UIImage imageWithData:data scale:[UIScreen mainScreen].scale] yy_imageByDecoded];
    } else {
        return index == 0 ? self : nil;
    }
}

프레임당 표시 시간 제공
- (NSTimeInterval)animatedImageDurationAtIndex:(NSUInteger)index {
    if (index >= _frameDurations.count) return 0;
    NSNumber *num = _frameDurations[index];
    return [num doubleValue];
}

자, 프레임 이미지 구현은 비교적 간단하고 코드도 뚜렷하고 알기 쉽습니다.더 많은 디테일은 스스로 발굴할 수 있습니다.

좋은 웹페이지 즐겨찾기