//
|
// YYAnimatedImageView.h
|
// YYImage <https://github.com/ibireme/YYImage>
|
//
|
// Created by ibireme on 14/10/19.
|
// 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 <UIKit/UIKit.h>
|
|
NS_ASSUME_NONNULL_BEGIN
|
|
/**
|
An image view for displaying animated image.
|
|
@discussion It is a fully compatible `UIImageView` subclass.
|
If the `image` or `highlightedImage` property adopt to the `YYAnimatedImage` protocol,
|
then it can be used to play the multi-frame animation. The animation can also be
|
controlled with the UIImageView methods `-startAnimating`, `-stopAnimating` and `-isAnimating`.
|
|
This view request the frame data just in time. When the device has enough free memory,
|
this view may cache some or all future frames in an inner buffer for lower CPU cost.
|
Buffer size is dynamically adjusted based on the current state of the device memory.
|
|
Sample Code:
|
|
// ani@3x.gif
|
YYImage *image = [YYImage imageNamed:@"ani"];
|
YYAnimatedImageView *imageView = [YYAnimatedImageView alloc] initWithImage:image];
|
[view addSubView:imageView];
|
*/
|
@interface YYAnimatedImageView : UIImageView
|
|
/**
|
If the image has more than one frame, set this value to `YES` will automatically
|
play/stop the animation when the view become visible/invisible.
|
|
The default value is `YES`.
|
*/
|
@property (nonatomic) BOOL autoPlayAnimatedImage;
|
|
/**
|
Index of the currently displayed frame (index from 0).
|
|
Set a new value to this property will cause to display the new frame immediately.
|
If the new value is invalid, this method has no effect.
|
|
You can add an observer to this property to observe the playing status.
|
*/
|
@property (nonatomic) NSUInteger currentAnimatedImageIndex;
|
|
/**
|
Whether the image view is playing animation currently.
|
|
You can add an observer to this property to observe the playing status.
|
*/
|
@property (nonatomic, readonly) BOOL currentIsPlayingAnimation;
|
|
/**
|
The animation timer's runloop mode, default is `NSRunLoopCommonModes`.
|
|
Set this property to `NSDefaultRunLoopMode` will make the animation pause during
|
UIScrollView scrolling.
|
*/
|
@property (nonatomic, copy) NSString *runloopMode;
|
|
/**
|
The max size (in bytes) for inner frame buffer size, default is 0 (dynamically).
|
|
When the device has enough free memory, this view will request and decode some or
|
all future frame image into an inner buffer. If this property's value is 0, then
|
the max buffer size will be dynamically adjusted based on the current state of
|
the device free memory. Otherwise, the buffer size will be limited by this value.
|
|
When receive memory warning or app enter background, the buffer will be released
|
immediately, and may grow back at the right time.
|
*/
|
@property (nonatomic) NSUInteger maxBufferSize;
|
|
@end
|
|
|
|
/**
|
The YYAnimatedImage protocol declares the required methods for animated image
|
display with YYAnimatedImageView.
|
|
Subclass a UIImage and implement this protocol, so that instances of that class
|
can be set to YYAnimatedImageView.image or YYAnimatedImageView.highlightedImage
|
to display animation.
|
|
See `YYImage` and `YYFrameImage` for example.
|
*/
|
@protocol YYAnimatedImage <NSObject>
|
@required
|
/// Total animated frame count.
|
/// It the frame count is less than 1, then the methods below will be ignored.
|
- (NSUInteger)animatedImageFrameCount;
|
|
/// Animation loop count, 0 means infinite looping.
|
- (NSUInteger)animatedImageLoopCount;
|
|
/// Bytes per frame (in memory). It may used to optimize memory buffer size.
|
- (NSUInteger)animatedImageBytesPerFrame;
|
|
/// Returns the frame image from a specified index.
|
/// This method may be called on background thread.
|
/// @param index Frame index (zero based).
|
- (nullable UIImage *)animatedImageFrameAtIndex:(NSUInteger)index;
|
|
/// Returns the frames's duration from a specified index.
|
/// @param index Frame index (zero based).
|
- (NSTimeInterval)animatedImageDurationAtIndex:(NSUInteger)index;
|
|
@optional
|
/// A rectangle in image coordinates defining the subrectangle of the image that
|
/// will be displayed. The rectangle should not outside the image's bounds.
|
/// It may used to display sprite animation with a single image (sprite sheet).
|
- (CGRect)animatedImageContentsRectAtIndex:(NSUInteger)index;
|
@end
|
|
NS_ASSUME_NONNULL_END
|