zoukankan      html  css  js  c++  java
  • 加载gif图过渡效果

    加载gif图片,过渡效果:

    调用:

    - (id)initWithGifView:(UIView *)view

    {

        self = [super initWithView:view];

        if (self) {

            self.color = [UIColor clearColor];

            NSString  *filePath = [[NSBundle bundleWithPath:[[NSBundle mainBundle] bundlePath]] pathForResource:@"loading2.gif" ofType:nil];

            NSData  *imageData = [NSData dataWithContentsOfFile:filePath];

            UIImageView *loadingImgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 110, 90)];

            loadingImgView.contentMode = UIViewContentModeCenter;

            loadingImgView.image = [UIImage sd_animatedGIFWithData:imageData];

            self.customView = loadingImgView;

            self.mode = MBProgressHUDModeCustomView;

            [view addSubview:self];

            [self show:YES];

        }

        return self;

    }

    封装:

    + (UIImage *)sd_animatedGIFWithData:(NSData *)data {

        if (!data) {

            return nil;

        }

        CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);

        size_t count = CGImageSourceGetCount(source);

        UIImage *animatedImage;

        if (count <= 1) {

            animatedImage = [[UIImage alloc] initWithData:data];

        }

        else {

            NSMutableArray *images = [NSMutableArray array];

            NSTimeInterval duration = 0.0f;

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

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

                duration += [self sd_frameDurationAtIndex:i source:source];

                [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]];

                CGImageRelease(image);

            }

            if (!duration) {

                duration = (1.0f / 10.0f) * count;

            }

            animatedImage = [UIImage animatedImageWithImages:images duration:duration];

        }

        CFRelease(source);

        return animatedImage;

    }

    + (float)sd_frameDurationAtIndex:(NSUInteger)index source:(CGImageSourceRef)source {

        float frameDuration = 0.1f;

        CFDictionaryRef cfFrameProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil);

        NSDictionary *frameProperties = (__bridge NSDictionary *)cfFrameProperties;

        NSDictionary *gifProperties = frameProperties[(NSString *)kCGImagePropertyGIFDictionary];

        NSNumber *delayTimeUnclampedProp = gifProperties[(NSString *)kCGImagePropertyGIFUnclampedDelayTime];

        if (delayTimeUnclampedProp) {

            frameDuration = [delayTimeUnclampedProp floatValue];

        }

        else {

            NSNumber *delayTimeProp = gifProperties[(NSString *)kCGImagePropertyGIFDelayTime];

            if (delayTimeProp) {

                frameDuration = [delayTimeProp floatValue];

            }

        }

        // Many annoying ads specify a 0 duration to make an image flash as quickly as possible.

        // We follow Firefox's behavior and use a duration of 100 ms for any frames that specify

        // a duration of <= 10 ms. See <rdar://problem/7689300> and <http://webkit.org/b/36082>

        // for more information.

        if (frameDuration < 0.011f) {

            frameDuration = 0.100f;

        }

        CFRelease(cfFrameProperties);

        return frameDuration;

    }

    + (UIImage *)sd_animatedGIFNamed:(NSString *)name {

        CGFloat scale = [UIScreen mainScreen].scale;

        if (scale > 1.0f) {

            NSString *retinaPath = [[NSBundle mainBundle] pathForResource:[name stringByAppendingString:@"@2x"] ofType:@"gif"];

            NSData *data = [NSData dataWithContentsOfFile:retinaPath];

            if (data) {

                return [UIImage sd_animatedGIFWithData:data];

            }

            NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"gif"];

            data = [NSData dataWithContentsOfFile:path];

            if (data) {

                return [UIImage sd_animatedGIFWithData:data];

            }

            return [UIImage imageNamed:name];

        }

        else {

            NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"gif"];

            NSData *data = [NSData dataWithContentsOfFile:path];

            if (data) {

                return [UIImage sd_animatedGIFWithData:data];

            }

            return [UIImage imageNamed:name];

        }

    }

    - (UIImage *)sd_animatedImageByScalingAndCroppingToSize:(CGSize)size {

        if (CGSizeEqualToSize(self.size, size) || CGSizeEqualToSize(size, CGSizeZero)) {

            return self;

        }

        CGSize scaledSize = size;

        CGPoint thumbnailPoint = CGPointZero;

        CGFloat widthFactor = size.width / self.size.width;

        CGFloat heightFactor = size.height / self.size.height;

        CGFloat scaleFactor = (widthFactor > heightFactor) ? widthFactor : heightFactor;

        scaledSize.width = self.size.width * scaleFactor;

        scaledSize.height = self.size.height * scaleFactor;

        if (widthFactor > heightFactor) {

            thumbnailPoint.y = (size.height - scaledSize.height) * 0.5;

        }

        else if (widthFactor < heightFactor) {

            thumbnailPoint.x = (size.width - scaledSize.width) * 0.5;

        }

        NSMutableArray *scaledImages = [NSMutableArray array];

        UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);

        for (UIImage *image in self.images) {

            [image drawInRect:CGRectMake(thumbnailPoint.x, thumbnailPoint.y, scaledSize.width, scaledSize.height)];

            UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

            [scaledImages addObject:newImage];

        }

        UIGraphicsEndImageContext();

        return [UIImage animatedImageWithImages:scaledImages duration:self.duration];

    }

    我调用的类是继承MBProgressHUD的。大家看的时候自己在研究下。

    做一个有心的女人 比做一个有心机的女人强!
  • 相关阅读:
    Tampermonkey 油猴脚本开发 入门
    k8s 上安装 lamp 环境
    centOS 7.9 k8s 安装 和 基本命令
    力扣59-螺旋矩阵 II
    力扣54-螺旋矩阵
    力扣705-设计哈希集合
    力扣706-设计哈希映射
    scrapy参数-COOKIES_ENABLED
    优雅降级、渐进增强
    e-cahr的地图组件封装(浙江省为例)
  • 原文地址:https://www.cnblogs.com/LongLianChuan/p/5082407.html
Copyright © 2011-2022 走看看