|
@@ -2,8 +2,8 @@ YYImage
|
|
|
==============
|
|
|
[](https://raw.githubusercontent.com/ibireme/YYImage/master/LICENSE)
|
|
|
[](https://github.com/Carthage/Carthage)
|
|
|
-[](http://cocoapods.org/?q= YYImage)
|
|
|
-[](http://cocoapods.org/?q= YYImage)
|
|
|
+[](http://cocoapods.org/pods/YYImage)
|
|
|
+[](http://cocoadocs.org/docsets/YYImage)
|
|
|
[](https://www.apple.com/nl/ios/)
|
|
|
[](https://travis-ci.org/ibireme/YYImage)
|
|
|
|
|
@@ -28,104 +28,109 @@ Usage
|
|
|
==============
|
|
|
|
|
|
### Display animated image
|
|
|
-
|
|
|
- // File: ani@3x.gif
|
|
|
- UIImage *image = [YYImage imageNamed:@"ani.gif"];
|
|
|
- UIImageView *imageView = [[YYAnimatedImageView alloc] initWithImage:image];
|
|
|
- [self.view addSubview:imageView];
|
|
|
-
|
|
|
+```objc
|
|
|
+// File: ani@3x.gif
|
|
|
+UIImage *image = [YYImage imageNamed:@"ani.gif"];
|
|
|
+UIImageView *imageView = [[YYAnimatedImageView alloc] initWithImage:image];
|
|
|
+[self.view addSubview:imageView];
|
|
|
+```
|
|
|
|
|
|
### Display frame animation
|
|
|
-
|
|
|
- // Files: frame1.png, frame2.png, frame3.png
|
|
|
- NSArray *paths = @[@"/ani/frame1.png", @"/ani/frame2.png", @"/ani/frame3.png"];
|
|
|
- NSArray *times = @[@0.1, @0.2, @0.1];
|
|
|
- UIImage *image = [YYFrameImage alloc] initWithImagePaths:paths frameDurations:times repeats:YES];
|
|
|
- UIImageView *imageView = [YYAnimatedImageView alloc] initWithImage:image];
|
|
|
- [self.view addSubview:imageView];
|
|
|
+```objc
|
|
|
+// Files: frame1.png, frame2.png, frame3.png
|
|
|
+NSArray *paths = @[@"/ani/frame1.png", @"/ani/frame2.png", @"/ani/frame3.png"];
|
|
|
+NSArray *times = @[@0.1, @0.2, @0.1];
|
|
|
+UIImage *image = [YYFrameImage alloc] initWithImagePaths:paths frameDurations:times repeats:YES];
|
|
|
+UIImageView *imageView = [YYAnimatedImageView alloc] initWithImage:image];
|
|
|
+[self.view addSubview:imageView];
|
|
|
+```
|
|
|
|
|
|
### Display sprite sheet animation
|
|
|
-
|
|
|
- // 8 * 12 sprites in a single sheet image
|
|
|
- UIImage *spriteSheet = [UIImage imageNamed:@"sprite-sheet"];
|
|
|
- NSMutableArray *contentRects = [NSMutableArray new];
|
|
|
- NSMutableArray *durations = [NSMutableArray new];
|
|
|
- for (int j = 0; j < 12; j++) {
|
|
|
- for (int i = 0; i < 8; i++) {
|
|
|
- CGRect rect;
|
|
|
- rect.size = CGSizeMake(img.size.width / 8, img.size.height / 12);
|
|
|
- rect.origin.x = img.size.width / 8 * i;
|
|
|
- rect.origin.y = img.size.height / 12 * j;
|
|
|
- [contentRects addObject:[NSValue valueWithCGRect:rect]];
|
|
|
- [durations addObject:@(1 / 60.0)];
|
|
|
- }
|
|
|
- }
|
|
|
- YYSpriteSheetImage *sprite;
|
|
|
- sprite = [[YYSpriteSheetImage alloc] initWithSpriteSheetImage:img
|
|
|
- contentRects:contentRects
|
|
|
- frameDurations:durations
|
|
|
- loopCount:0];
|
|
|
- YYAnimatedImageView *imageView = [YYAnimatedImageView new];
|
|
|
- imageView.size = CGSizeMake(img.size.width / 8, img.size.height / 12);
|
|
|
- imageView.image = sprite;
|
|
|
- [self.view addSubview:imageView];
|
|
|
+```objc
|
|
|
+// 8 * 12 sprites in a single sheet image
|
|
|
+UIImage *spriteSheet = [UIImage imageNamed:@"sprite-sheet"];
|
|
|
+NSMutableArray *contentRects = [NSMutableArray new];
|
|
|
+NSMutableArray *durations = [NSMutableArray new];
|
|
|
+for (int j = 0; j < 12; j++) {
|
|
|
+ for (int i = 0; i < 8; i++) {
|
|
|
+ CGRect rect;
|
|
|
+ rect.size = CGSizeMake(img.size.width / 8, img.size.height / 12);
|
|
|
+ rect.origin.x = img.size.width / 8 * i;
|
|
|
+ rect.origin.y = img.size.height / 12 * j;
|
|
|
+ [contentRects addObject:[NSValue valueWithCGRect:rect]];
|
|
|
+ [durations addObject:@(1 / 60.0)];
|
|
|
+ }
|
|
|
+}
|
|
|
+YYSpriteSheetImage *sprite;
|
|
|
+sprite = [[YYSpriteSheetImage alloc] initWithSpriteSheetImage:img
|
|
|
+ contentRects:contentRects
|
|
|
+ frameDurations:durations
|
|
|
+ loopCount:0];
|
|
|
+YYAnimatedImageView *imageView = [YYAnimatedImageView new];
|
|
|
+imageView.size = CGSizeMake(img.size.width / 8, img.size.height / 12);
|
|
|
+imageView.image = sprite;
|
|
|
+[self.view addSubview:imageView];
|
|
|
+```
|
|
|
|
|
|
### Animation control
|
|
|
-
|
|
|
- YYAnimatedImageView *imageView = ...;
|
|
|
- // pause:
|
|
|
- [imageView stopAnimating];
|
|
|
- // play:
|
|
|
- [imageView startAnimating];
|
|
|
- // set frame index:
|
|
|
- imageView.currentAnimatedImageIndex = 12;
|
|
|
- // get current status
|
|
|
- image.currentIsPlayingAnimation;
|
|
|
-
|
|
|
+```objc
|
|
|
+YYAnimatedImageView *imageView = ...;
|
|
|
+// pause:
|
|
|
+[imageView stopAnimating];
|
|
|
+// play:
|
|
|
+[imageView startAnimating];
|
|
|
+// set frame index:
|
|
|
+imageView.currentAnimatedImageIndex = 12;
|
|
|
+// get current status
|
|
|
+image.currentIsPlayingAnimation;
|
|
|
+```
|
|
|
+
|
|
|
### Image decoder
|
|
|
-
|
|
|
- // Decode single frame:
|
|
|
- NSData *data = [NSData dataWithContentsOfFile:@"/tmp/image.webp"];
|
|
|
- YYImageDecoder *decoder = [YYImageDecoder decoderWithData:data scale:2.0];
|
|
|
- UIImage image = [decoder frameAtIndex:0 decodeForDisplay:YES].image;
|
|
|
+```objc
|
|
|
+// Decode single frame:
|
|
|
+NSData *data = [NSData dataWithContentsOfFile:@"/tmp/image.webp"];
|
|
|
+YYImageDecoder *decoder = [YYImageDecoder decoderWithData:data scale:2.0];
|
|
|
+UIImage image = [decoder frameAtIndex:0 decodeForDisplay:YES].image;
|
|
|
|
|
|
- // Progressive:
|
|
|
- NSMutableData *data = [NSMutableData new];
|
|
|
- YYImageDecoder *decoder = [[YYImageDecoder alloc] initWithScale:2.0];
|
|
|
- while(newDataArrived) {
|
|
|
- [data appendData:newData];
|
|
|
- [decoder updateData:data final:NO];
|
|
|
- if (decoder.frameCount > 0) {
|
|
|
- UIImage image = [decoder frameAtIndex:0 decodeForDisplay:YES].image;
|
|
|
- // progressive display...
|
|
|
- }
|
|
|
- }
|
|
|
- [decoder updateData:data final:YES];
|
|
|
- UIImage image = [decoder frameAtIndex:0 decodeForDisplay:YES].image;
|
|
|
- // final display...
|
|
|
+// Progressive:
|
|
|
+NSMutableData *data = [NSMutableData new];
|
|
|
+YYImageDecoder *decoder = [[YYImageDecoder alloc] initWithScale:2.0];
|
|
|
+while(newDataArrived) {
|
|
|
+ [data appendData:newData];
|
|
|
+ [decoder updateData:data final:NO];
|
|
|
+ if (decoder.frameCount > 0) {
|
|
|
+ UIImage image = [decoder frameAtIndex:0 decodeForDisplay:YES].image;
|
|
|
+ // progressive display...
|
|
|
+ }
|
|
|
+}
|
|
|
+[decoder updateData:data final:YES];
|
|
|
+UIImage image = [decoder frameAtIndex:0 decodeForDisplay:YES].image;
|
|
|
+// final display...
|
|
|
+```
|
|
|
|
|
|
### Image encoder
|
|
|
-
|
|
|
- // Encode still image:
|
|
|
- YYImageEncoder *jpegEncoder = [[YYImageEncoder alloc] initWithType:YYImageTypeJPEG];
|
|
|
- jpegEncoder.quality = 0.9;
|
|
|
- [jpegEncoder addImage:image duration:0];
|
|
|
- NSData jpegData = [jpegEncoder encode];
|
|
|
-
|
|
|
- // Encode animated image:
|
|
|
- YYImageEncoder *webpEncoder = [[YYImageEncoder alloc] initWithType:YYImageTypeWebP];
|
|
|
- webpEncoder.loopCount = 5;
|
|
|
- [webpEncoder addImage:image0 duration:0.1];
|
|
|
- [webpEncoder addImage:image1 duration:0.15];
|
|
|
- [webpEncoder addImage:image2 duration:0.2];
|
|
|
- NSData webpData = [webpEncoder encode];
|
|
|
+```objc
|
|
|
+// Encode still image:
|
|
|
+YYImageEncoder *jpegEncoder = [[YYImageEncoder alloc] initWithType:YYImageTypeJPEG];
|
|
|
+jpegEncoder.quality = 0.9;
|
|
|
+[jpegEncoder addImage:image duration:0];
|
|
|
+NSData jpegData = [jpegEncoder encode];
|
|
|
+
|
|
|
+// Encode animated image:
|
|
|
+YYImageEncoder *webpEncoder = [[YYImageEncoder alloc] initWithType:YYImageTypeWebP];
|
|
|
+webpEncoder.loopCount = 5;
|
|
|
+[webpEncoder addImage:image0 duration:0.1];
|
|
|
+[webpEncoder addImage:image1 duration:0.15];
|
|
|
+[webpEncoder addImage:image2 duration:0.2];
|
|
|
+NSData webpData = [webpEncoder encode];
|
|
|
+```
|
|
|
|
|
|
### Image type detection
|
|
|
-
|
|
|
- // Get image type from image data
|
|
|
- YYImageType type = YYImageDetectType(data);
|
|
|
- if (type == YYImageTypePNG) ...
|
|
|
-
|
|
|
+```objc
|
|
|
+// Get image type from image data
|
|
|
+YYImageType type = YYImageDetectType(data);
|
|
|
+if (type == YYImageTypePNG) ...
|
|
|
+```
|
|
|
|
|
|
Installation
|
|
|
==============
|
|
@@ -180,7 +185,7 @@ You can also install documentation locally using [appledoc](https://github.com/t
|
|
|
|
|
|
Requirements
|
|
|
==============
|
|
|
-This library requires `iOS 6.0+` and `Xcode 7.0+`.
|
|
|
+This library requires `iOS 6.0+` and `Xcode 8.0+`.
|
|
|
|
|
|
|
|
|
License
|
|
@@ -217,105 +222,110 @@ YYImage: 功能强大的 iOS 图像框架。<br/>
|
|
|
==============
|
|
|
|
|
|
### 显示动画类型的图片
|
|
|
-
|
|
|
- // 文件: ani@3x.gif
|
|
|
- UIImage *image = [YYImage imageNamed:@"ani.gif"];
|
|
|
- UIImageView *imageView = [[YYAnimatedImageView alloc] initWithImage:image];
|
|
|
- [self.view addSubview:imageView];
|
|
|
-
|
|
|
+```objc
|
|
|
+// 文件: ani@3x.gif
|
|
|
+UIImage *image = [YYImage imageNamed:@"ani.gif"];
|
|
|
+UIImageView *imageView = [[YYAnimatedImageView alloc] initWithImage:image];
|
|
|
+[self.view addSubview:imageView];
|
|
|
+```
|
|
|
|
|
|
### 播放帧动画
|
|
|
-
|
|
|
- // 文件: frame1.png, frame2.png, frame3.png
|
|
|
- NSArray *paths = @[@"/ani/frame1.png", @"/ani/frame2.png", @"/ani/frame3.png"];
|
|
|
- NSArray *times = @[@0.1, @0.2, @0.1];
|
|
|
- UIImage *image = [YYFrameImage alloc] initWithImagePaths:paths frameDurations:times repeats:YES];
|
|
|
- UIImageView *imageView = [YYAnimatedImageView alloc] initWithImage:image];
|
|
|
- [self.view addSubview:imageView];
|
|
|
+```objc
|
|
|
+// 文件: frame1.png, frame2.png, frame3.png
|
|
|
+NSArray *paths = @[@"/ani/frame1.png", @"/ani/frame2.png", @"/ani/frame3.png"];
|
|
|
+NSArray *times = @[@0.1, @0.2, @0.1];
|
|
|
+UIImage *image = [YYFrameImage alloc] initWithImagePaths:paths frameDurations:times repeats:YES];
|
|
|
+UIImageView *imageView = [YYAnimatedImageView alloc] initWithImage:image];
|
|
|
+[self.view addSubview:imageView];
|
|
|
+```
|
|
|
|
|
|
### 播放 sprite sheet 动画
|
|
|
-
|
|
|
- // 8 * 12 sprites in a single sheet image
|
|
|
- UIImage *spriteSheet = [UIImage imageNamed:@"sprite-sheet"];
|
|
|
- NSMutableArray *contentRects = [NSMutableArray new];
|
|
|
- NSMutableArray *durations = [NSMutableArray new];
|
|
|
- for (int j = 0; j < 12; j++) {
|
|
|
- for (int i = 0; i < 8; i++) {
|
|
|
- CGRect rect;
|
|
|
- rect.size = CGSizeMake(img.size.width / 8, img.size.height / 12);
|
|
|
- rect.origin.x = img.size.width / 8 * i;
|
|
|
- rect.origin.y = img.size.height / 12 * j;
|
|
|
- [contentRects addObject:[NSValue valueWithCGRect:rect]];
|
|
|
- [durations addObject:@(1 / 60.0)];
|
|
|
- }
|
|
|
- }
|
|
|
- YYSpriteSheetImage *sprite;
|
|
|
- sprite = [[YYSpriteSheetImage alloc] initWithSpriteSheetImage:img
|
|
|
- contentRects:contentRects
|
|
|
- frameDurations:durations
|
|
|
- loopCount:0];
|
|
|
- YYAnimatedImageView *imageView = [YYAnimatedImageView new];
|
|
|
- imageView.size = CGSizeMake(img.size.width / 8, img.size.height / 12);
|
|
|
- imageView.image = sprite;
|
|
|
- [self.view addSubview:imageView];
|
|
|
+```objc
|
|
|
+// 8 * 12 sprites in a single sheet image
|
|
|
+UIImage *spriteSheet = [UIImage imageNamed:@"sprite-sheet"];
|
|
|
+NSMutableArray *contentRects = [NSMutableArray new];
|
|
|
+NSMutableArray *durations = [NSMutableArray new];
|
|
|
+for (int j = 0; j < 12; j++) {
|
|
|
+ for (int i = 0; i < 8; i++) {
|
|
|
+ CGRect rect;
|
|
|
+ rect.size = CGSizeMake(img.size.width / 8, img.size.height / 12);
|
|
|
+ rect.origin.x = img.size.width / 8 * i;
|
|
|
+ rect.origin.y = img.size.height / 12 * j;
|
|
|
+ [contentRects addObject:[NSValue valueWithCGRect:rect]];
|
|
|
+ [durations addObject:@(1 / 60.0)];
|
|
|
+ }
|
|
|
+}
|
|
|
+YYSpriteSheetImage *sprite;
|
|
|
+sprite = [[YYSpriteSheetImage alloc] initWithSpriteSheetImage:img
|
|
|
+ contentRects:contentRects
|
|
|
+ frameDurations:durations
|
|
|
+ loopCount:0];
|
|
|
+YYAnimatedImageView *imageView = [YYAnimatedImageView new];
|
|
|
+imageView.size = CGSizeMake(img.size.width / 8, img.size.height / 12);
|
|
|
+imageView.image = sprite;
|
|
|
+[self.view addSubview:imageView];
|
|
|
+```
|
|
|
|
|
|
### 动画播放控制
|
|
|
-
|
|
|
- YYAnimatedImageView *imageView = ...;
|
|
|
- // 暂停:
|
|
|
- [imageView stopAnimating];
|
|
|
- // 播放:
|
|
|
- [imageView startAnimating];
|
|
|
- // 设置播放进度:
|
|
|
- imageView.currentAnimatedImageIndex = 12;
|
|
|
- // 获取播放状态:
|
|
|
- image.currentIsPlayingAnimation;
|
|
|
- //上面两个属性都支持 KVO。
|
|
|
-
|
|
|
+```objc
|
|
|
+YYAnimatedImageView *imageView = ...;
|
|
|
+// 暂停:
|
|
|
+[imageView stopAnimating];
|
|
|
+// 播放:
|
|
|
+[imageView startAnimating];
|
|
|
+// 设置播放进度:
|
|
|
+imageView.currentAnimatedImageIndex = 12;
|
|
|
+// 获取播放状态:
|
|
|
+image.currentIsPlayingAnimation;
|
|
|
+//上面两个属性都支持 KVO。
|
|
|
+```
|
|
|
+
|
|
|
### 图片解码
|
|
|
-
|
|
|
- // 解码单帧图片:
|
|
|
- NSData *data = [NSData dataWithContentsOfFile:@"/tmp/image.webp"];
|
|
|
- YYImageDecoder *decoder = [YYImageDecoder decoderWithData:data scale:2.0];
|
|
|
- UIImage image = [decoder frameAtIndex:0 decodeForDisplay:YES].image;
|
|
|
+```objc
|
|
|
+// 解码单帧图片:
|
|
|
+NSData *data = [NSData dataWithContentsOfFile:@"/tmp/image.webp"];
|
|
|
+YYImageDecoder *decoder = [YYImageDecoder decoderWithData:data scale:2.0];
|
|
|
+UIImage image = [decoder frameAtIndex:0 decodeForDisplay:YES].image;
|
|
|
|
|
|
- // 渐进式图片解码 (可用于图片下载显示):
|
|
|
- NSMutableData *data = [NSMutableData new];
|
|
|
- YYImageDecoder *decoder = [[YYImageDecoder alloc] initWithScale:2.0];
|
|
|
- while(newDataArrived) {
|
|
|
- [data appendData:newData];
|
|
|
- [decoder updateData:data final:NO];
|
|
|
- if (decoder.frameCount > 0) {
|
|
|
- UIImage image = [decoder frameAtIndex:0 decodeForDisplay:YES].image;
|
|
|
- // progressive display...
|
|
|
- }
|
|
|
- }
|
|
|
- [decoder updateData:data final:YES];
|
|
|
- UIImage image = [decoder frameAtIndex:0 decodeForDisplay:YES].image;
|
|
|
- // final display...
|
|
|
+// 渐进式图片解码 (可用于图片下载显示):
|
|
|
+NSMutableData *data = [NSMutableData new];
|
|
|
+YYImageDecoder *decoder = [[YYImageDecoder alloc] initWithScale:2.0];
|
|
|
+while(newDataArrived) {
|
|
|
+ [data appendData:newData];
|
|
|
+ [decoder updateData:data final:NO];
|
|
|
+ if (decoder.frameCount > 0) {
|
|
|
+ UIImage image = [decoder frameAtIndex:0 decodeForDisplay:YES].image;
|
|
|
+ // progressive display...
|
|
|
+ }
|
|
|
+}
|
|
|
+[decoder updateData:data final:YES];
|
|
|
+UIImage image = [decoder frameAtIndex:0 decodeForDisplay:YES].image;
|
|
|
+// final display...
|
|
|
+```
|
|
|
|
|
|
### 图片编码
|
|
|
-
|
|
|
- // 编码静态图 (支持各种常见图片格式):
|
|
|
- YYImageEncoder *jpegEncoder = [[YYImageEncoder alloc] initWithType:YYImageTypeJPEG];
|
|
|
- jpegEncoder.quality = 0.9;
|
|
|
- [jpegEncoder addImage:image duration:0];
|
|
|
- NSData jpegData = [jpegEncoder encode];
|
|
|
-
|
|
|
- // 编码动态图 (支持 GIF/APNG/WebP):
|
|
|
- YYImageEncoder *webpEncoder = [[YYImageEncoder alloc] initWithType:YYImageTypeWebP];
|
|
|
- webpEncoder.loopCount = 5;
|
|
|
- [webpEncoder addImage:image0 duration:0.1];
|
|
|
- [webpEncoder addImage:image1 duration:0.15];
|
|
|
- [webpEncoder addImage:image2 duration:0.2];
|
|
|
- NSData webpData = [webpEncoder encode];
|
|
|
+```objc
|
|
|
+// 编码静态图 (支持各种常见图片格式):
|
|
|
+YYImageEncoder *jpegEncoder = [[YYImageEncoder alloc] initWithType:YYImageTypeJPEG];
|
|
|
+jpegEncoder.quality = 0.9;
|
|
|
+[jpegEncoder addImage:image duration:0];
|
|
|
+NSData jpegData = [jpegEncoder encode];
|
|
|
+
|
|
|
+// 编码动态图 (支持 GIF/APNG/WebP):
|
|
|
+YYImageEncoder *webpEncoder = [[YYImageEncoder alloc] initWithType:YYImageTypeWebP];
|
|
|
+webpEncoder.loopCount = 5;
|
|
|
+[webpEncoder addImage:image0 duration:0.1];
|
|
|
+[webpEncoder addImage:image1 duration:0.15];
|
|
|
+[webpEncoder addImage:image2 duration:0.2];
|
|
|
+NSData webpData = [webpEncoder encode];
|
|
|
+```
|
|
|
|
|
|
### 图片类型探测
|
|
|
-
|
|
|
- // 获取图片类型
|
|
|
- YYImageType type = YYImageDetectType(data);
|
|
|
- if (type == YYImageTypePNG) ...
|
|
|
-
|
|
|
+```objc
|
|
|
+// 获取图片类型
|
|
|
+YYImageType type = YYImageDetectType(data);
|
|
|
+if (type == YYImageTypePNG) ...
|
|
|
+```
|
|
|
|
|
|
安装
|
|
|
==============
|
|
@@ -368,7 +378,7 @@ A: 你应该禁用 Build Settings 中的 `Compress PNG Files` 和 `Remove Text M
|
|
|
|
|
|
系统要求
|
|
|
==============
|
|
|
-该项目最低支持 `iOS 6.0` 和 `Xcode 7.0`。
|
|
|
+该项目最低支持 `iOS 6.0` 和 `Xcode 8.0`。
|
|
|
|
|
|
|
|
|
许可证
|