123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- //
- // YYSpriteImage.m
- // YYKit <https://github.com/ibireme/YYKit>
- //
- // 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
|