ios html gif 显示,iOS gif图显示问题

问题

有时候需要显示gif动态图,让界面更加的绚丽,但是iOS默认只支持png,gpg图片。那么如何才能显示gif图呢?

解决方式

添加框架

CoreGraphics.framework

ImageIO.framework

引入SCGIFImageView类

SCGIFImageView.h

#import @interface SCGIFImageFrame : NSObject {

}

@property (nonatomic) double duration;

@property (nonatomic, retain) UIImage* image;

@end

@interface SCGIFImageView : UIImageView {

NSInteger _currentImageIndex;

}

@property (nonatomic, retain) NSArray* imageFrameArray;

@property (nonatomic, retain) NSTimer* timer;

@property (nonatomic, assign) NSInteger sumCount;

//Setting this value to pause or continue animation;

@property (nonatomic) BOOL animating;

- (void)setData:(NSData*)imageData;

@end

SCGIFImageView.m

#import "SCGIFImageView.h"

#import @implementation SCGIFImageFrame

@synthesize image = _image;

@synthesize duration = _duration;

@end

@interface SCGIFImageView ()

- (void)resetTimer;

- (void)showNextImage;

@end

@implementation SCGIFImageView

@synthesize imageFrameArray = _imageFrameArray;

@synthesize timer = _timer;

@synthesize animating = _animating;

- (void)resetTimer {

if (_timer && _timer.isValid) {

[_timer invalidate];

}

self.timer = nil;

}

- (void)setData:(NSData *)imageData {

if (!imageData) {

return;

}

[self resetTimer];

CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)imageData, NULL);

size_t count = CGImageSourceGetCount(source);

NSMutableArray* tmpArray = [NSMutableArray array];

for (size_t i = 0; i < count; i++) {

SCGIFImageFrame* gifImage = [[SCGIFImageFrame alloc] init];

CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);

gifImage.image = [UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp];

NSDictionary* frameProperties = CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(source, i, NULL));

gifImage.duration = [[[frameProperties objectForKey:(NSString*)kCGImagePropertyGIFDictionary] objectForKey:(NSString*)kCGImagePropertyGIFDelayTime] doubleValue];

gifImage.duration = MAX(gifImage.duration, 0.01);

[tmpArray addObject:gifImage];

CGImageRelease(image);

}

CFRelease(source);

self.imageFrameArray = nil;

if (tmpArray.count > 1) {

self.imageFrameArray = tmpArray;

_currentImageIndex = -1;

_animating = YES;

[self showNextImage];

} else {

self.image = [UIImage imageWithData:imageData];

}

}

- (void)setImage:(UIImage *)image {

[super setImage:image];

[self resetTimer];

self.imageFrameArray = nil;

_animating = NO;

}

- (void)showNextImage {

if (_sumCount > 0) {

_animating = _sumCount - 1 == _currentImageIndex ? NO : YES;

}

if (!_animating) {

return;

}

_currentImageIndex = (++_currentImageIndex) % _imageFrameArray.count;

SCGIFImageFrame* gifImage = [_imageFrameArray objectAtIndex:_currentImageIndex];

[super setImage:[gifImage image]];

self.timer = [NSTimer scheduledTimerWithTimeInterval:gifImage.duration target:self selector:@selector(showNextImage) userInfo:nil repeats:NO];

}

- (void)setAnimating:(BOOL)animating {

if (_imageFrameArray.count < 2) {

_animating = animating;

return;

}

if (!_animating && animating) {

//continue

_animating = animating;

if (!_timer) {

[self showNextImage];

}

} else if (_animating && !animating) {

//stop

_animating = animating;

[self resetTimer];

}

}

@end

添加gif图片

在Images.xcassets中添加需要的gif动态图。

使用方式

引入头文件SCGIFImageView.h

在需要的添加的地方添加以下代码 NSString* filePath = [[NSBundle mainBundle] pathForResource:@"6plus_hover.gif" ofType:nil];

NSData* imageData = [NSData dataWithContentsOfFile:filePath];

SCGIFImageView* gifImageView = [[SCGIFImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];

[gifImageView setData:imageData];

[gifImageView setSumCount:gifImageView.imageFrameArray.count];//设置只循环一次,不设置无限循环

[self.view addSubview:gifImageView];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值