//
|
// YYSpriteImage.m
|
// YYImage <https://github.com/ibireme/YYImage>
|
//
|
// Created by ibireme on 15/4/21.
|
// Copyright (c) 2015 ibireme.
|
//
|
// This source code is licensed under the MIT-style license found in the
|
// LICENSE file in the root directory of this source tree.
|
//
|
|
#import "YYSpriteSheetImage.h"
|
|
@implementation YYSpriteSheetImage
|
|
- (instancetype)initWithSpriteSheetImage:(UIImage *)image
|
contentRects:(NSArray *)contentRects
|
frameDurations:(NSArray *)frameDurations
|
loopCount:(NSUInteger)loopCount {
|
if (!image.CGImage) return nil;
|
if (contentRects.count < 1 || frameDurations.count < 1) return nil;
|
if (contentRects.count != frameDurations.count) return nil;
|
|
self = [super initWithCGImage:image.CGImage scale:image.scale orientation:image.imageOrientation];
|
if (!self) return nil;
|
|
_contentRects = contentRects.copy;
|
_frameDurations = frameDurations.copy;
|
_loopCount = loopCount;
|
return self;
|
}
|
|
- (CGRect)contentsRectForCALayerAtIndex:(NSUInteger)index {
|
CGRect layerRect = CGRectMake(0, 0, 1, 1);
|
if (index >= _contentRects.count) return layerRect;
|
|
CGSize imageSize = self.size;
|
CGRect rect = [self animatedImageContentsRectAtIndex:index];
|
if (imageSize.width > 0.01 && imageSize.height > 0.01) {
|
layerRect.origin.x = rect.origin.x / imageSize.width;
|
layerRect.origin.y = rect.origin.y / imageSize.height;
|
layerRect.size.width = rect.size.width / imageSize.width;
|
layerRect.size.height = rect.size.height / imageSize.height;
|
layerRect = CGRectIntersection(layerRect, CGRectMake(0, 0, 1, 1));
|
if (CGRectIsNull(layerRect) || CGRectIsEmpty(layerRect)) {
|
layerRect = CGRectMake(0, 0, 1, 1);
|
}
|
}
|
return layerRect;
|
}
|
|
#pragma mark @protocol YYAnimatedImage
|
|
- (NSUInteger)animatedImageFrameCount {
|
return _contentRects.count;
|
}
|
|
- (NSUInteger)animatedImageLoopCount {
|
return _loopCount;
|
}
|
|
- (NSUInteger)animatedImageBytesPerFrame {
|
return 0;
|
}
|
|
- (UIImage *)animatedImageFrameAtIndex:(NSUInteger)index {
|
return self;
|
}
|
|
- (NSTimeInterval)animatedImageDurationAtIndex:(NSUInteger)index {
|
if (index >= _frameDurations.count) return 0;
|
return ((NSNumber *)_frameDurations[index]).doubleValue;
|
}
|
|
- (CGRect)animatedImageContentsRectAtIndex:(NSUInteger)index {
|
if (index >= _contentRects.count) return CGRectZero;
|
return ((NSValue *)_contentRects[index]).CGRectValue;
|
}
|
|
@end
|