iOS之加载Gif图片的几种方法

iOS之加载Gif图片的几种方法,第1张

Gif图片是非常常见的图片格式,尤其是在聊天的过程中,Gif表情使用地很频繁。但是iOS竟然没有现成的支持加载和播放Gif的类。

简单地汇总了一下,大概有以下几种方法:

但是使用 UIWebView 的弊端在于,不能设置Gif动画的播放时间。

最好把所需要的Gif图片打包到 Bundle 文件内,如下图所示

[图片上传失败...(image-64cf3c-1520924420422)]

但是很遗憾, SDWebImage sd_setImageWithURL:placeholderImage: 这个方法是不能播放本地Gif的,它只能显示Gif的第一张图片而已。So,此方法行不通

其实,在 SDWebImage 这个库里有一个 UIImage+GIF 的类别,里面为 UIImage 扩展了三个方法:

大家一看就知道,我们要获取处理后的Gif图片,其实只要调用前面两个中的其中一个方法就行了

我们就使用第二个方法试一试效果:

然后通过断点,我们看下获取到的image是个什么样的东东:

[图片上传失败...(image-2a63c5-1520924420421)]

我们发现:

其实,动画执续时间 _duration 也可以更改!

我们来看下此方法的内部实现:

很明显,duration是可以随意更改的,只不过此方法设置了一个默认值

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

归根到底,创建新的动态的Image其实是调用了系统提供的一个 UIImage 的类方法而已:

加载网络的Gif文件就简单多了。最简单的方法,我们只需要使用 SDWebImage sd_setImageWithURL: 这个方法传入Gif文件是url地址即可。

纠其原因:稍微仔细看了 SDWebImage 内部实现就可以清楚,大概是以下几个步骤:

............................................................

1、使用 UIWebView 不可以设置 duration ,其他两种方法都可设置。而且方法1的容器为 UIWebView ,其余两种的容器都是大家熟悉的 UIImageView

2、方法2和方法3需要对应看应用场景

直接使用 SDWebImage sd_setImageWithURL: 这个方法传入Gif文件是url地址即可

1. iphone怎么设置锁屏动态壁纸和主屏动态

第一步、点击打开“设置”选项;第二步、找到“墙纸与亮度”,点击进入;第三步、点击“选取墙纸”下面的图片;第四步、在墙纸选取选项中,可以选择苹果的内置壁纸,也可以选取手机相册中的图片;第五步、其中官方内置壁纸又分为动态和静态壁纸,这里以先选择动态壁纸为例,点击“动态壁纸”选项;第六步、系统内置了七款动态壁纸,选择自己喜欢的动态壁纸;第七步、随后会在底部d出“设定”按钮,点击设定按钮;第八步、在壁纸设置里有三个选项,从上到下分别是:设定锁定屏–即锁屏界面的壁纸设定主屏–即解锁后在主屏上看到的背景图片同时设定–即同时把这张壁纸设定为锁定和主屏壁纸以设定为锁定屏为例,点击“设定为锁定屏”选项第九步、设定好以后,按电源键锁定iPhone6plus,再打开屏幕即可看到锁屏壁纸已经变成了动态壁纸了。

2. iphone6 主屏幕可以设置动态壁纸吗

可以。

1.首先,打开iPhone上的【设置】-【墙纸】 步骤阅读 2.点击【选取新墙纸】 步骤阅读 3.在选取页面,点击【Live】,里面是iPhone6s自带的Live Photos 如果是自己导入或者拍摄的Live Photos(导入和拍摄方法可以查看下面的链接),点击相机胶卷进行选择 5iPhone6s怎么导入Live Photos 步骤阅读 4.选择喜欢的动态壁纸 步骤阅读 按压屏幕可以预览壁纸效果,选择【Live Photo】,再点击【设定】 步骤阅读 6 选择【设定锁定屏幕】,注意设定主屏幕按压是没有动态效果的 步骤阅读 END参考资料 威锋论坛.威锋网[引用时间2017-12-27]。

3. 苹果6p手机主屏幕3d动态图是怎么弄的

首先我们要先利用livephoto拍一张照片,然后打开手机中的【设置】,然后找到【墙纸】,打开它然后点击【选取新的墙纸】来选取墙纸。

然后在“照片”下方,找到你存放拍的动态照片的文件夹,一般就是在“相机胶卷”里面的。找到你刚才拍好的livephoto打开之后,你可以看到下方有三个选项,“静止”、“透视”、“livephoto”,选择【livephoto】,然后再点击【设定】选择设定之后就会d出提示框,是要设置成锁定屏幕还是主屏幕,还是两个都设定,如果你只是想使用livephoto的效果,那么就设置成锁定屏幕,点击【设定锁定屏幕】设置成功之后,我们将手机锁屏,然后在打开,用手指按,就能看到动态的图片。

4. 苹果6p手机主屏幕3d动态图是怎么弄的

首先我们要先利用livephoto拍一张照片,然后打开手机中的【设置】,然后找到【墙纸】,打开它

然后点击【选取新的墙纸】来选取墙纸。

然后在“照片”下方,找到你存放拍的动态照片的文件夹,一般就是在“相机胶卷”里面的。

找到你刚才拍好的livephoto

打开之后,你可以看到下方有三个选项,“静止”、“透视”、“livephoto”,选择【livephoto】,然后再点击【设定】

选择设定之后就会d出提示框,是要设置成锁定屏幕还是主屏幕,还是两个都设定,如果你只是想使用livephoto的效果,那么就设置成锁定屏幕,点击【设定锁定屏幕】

设置成功之后,我们将手机锁屏,然后在打开,用手指按,就能看到动态的图片。

5. iPhone6s怎么设置主屏幕的livephoto动态壁纸,注意是主屏幕,不是锁

打开自己的苹果6s手机,解锁后,在自己手机页面里找到那个像齿轮样的“设置”这个功能键,点击打开。

苹果6s怎么设置live photo动态锁屏

点击“设置”会出现如图所示的页面,找到“墙纸”这个功能,点击打开“墙纸”。

苹果6s怎么设置live photo动态锁屏

打开“墙纸”后,然后点击“选取新的墙纸”。

苹果6s怎么设置live photo动态锁屏

点击如图所示的“Live”后,会出现一些壁纸,然后根据自己的喜好选择一款壁纸就可以。

苹果6s怎么设置live photo动态锁屏

苹果6s怎么设置live photo动态锁屏

点击如图所显示的壁纸后,会出现“静止”、“透视”、“Live Photo”这三个选项,我们点击“Live Photo”这个功能。

苹果6s怎么设置live photo动态锁屏

苹果6s怎么设置live photo动态锁屏

点击“Live Photo”后,出现如下图所示的一些功能,点击如下图所示的“设定锁定屏幕”,就可以了。

苹果6s怎么设置live photo动态锁屏

这样就大功告成了,你会发现通过你的手指常按屏幕,你所选中的墙纸会动起来的。

苹果6s怎么设置live photo动态锁屏

6. 苹果手机是不是只有锁屏屏幕能设置动态图

不是的,主屏幕也是可以的。

可以点开设置,在点开桌面壁纸,就会有动态或者静态就可以选择应用了。

iPhone,是苹果公司旗下研发的智能手机系列,它搭载苹果公司研发的iOS手机作业系统。第一代iPhone于2007年1月9日由当时苹果公司CEO的史蒂夫·乔布斯发布,并在同年6月29日正式发售。

第七代的iPhone 5S和iPhone 5C于2013年9月10日发布,同年9月20日正式发售。第八代的iPhone 6和iPhone6 Plus于2014年9月10日发布。2015年9月10日凌晨1点,苹果将召开2015年秋季发布会,发布三款不同型号的新iPhone,分别是iPhone 6S、iPhone 6S Plus。

2016年3月21日凌晨1点,苹果召开了2016年春季发布会,发布了iPhone SE,而不是网上说的iPhone 6C。

iPhone 7于北京时间2016年9月8日凌晨1点在美国旧金山比尔·格雷厄姆市政礼堂2016年苹果秋季新品发布会上发布。

2016年11月25日,苹果在官网更新了iPhone在国内的保修政策,不再以换代修。

2017年3月21日,苹果推出了一款拥有动人红色外观的特别版iPhone 7和iPhone 7 Plus,起售价格为6188元。

2017年9月13日,苹果推出了新一代产品iPhone 8和iPhone 8 Plus、iPhone X和iPhone X Plus。

7. IPhone动态壁纸设置主屏幕为什么不会动

苹果手机动态壁纸不动主要是因为一个设定成静态壁纸了,二是设定成主屏壁纸了。

只需要将壁纸重新设置为锁屏屏幕壁纸,即可看到live动态壁纸效果了。

iphone动态壁纸不动解决办法:

一、按顺序打开【设置】-【墙纸】-【选取新的墙纸】-【live】如下图:

二、在live列表中,点击任意动态壁纸如下图:

三、进入墙纸预览页面后,点击【live Photo】选项才可以预览动态墙纸如下图:

四、点击【设定】,选择【设定锁定屏幕】或【同时设定】,即可如下图:

8. 苹果手机主屏壁纸怎么设置Live设置了不动

苹果手机主屏壁纸设置Live不动:检查核实是否设定了主屏幕动态墙纸,如只设定了锁定屏幕动态墙纸只有在锁屏的时候是动态的,建议同时设定屏幕动态墙纸再进行检查,同时设定屏幕动态墙纸的具体 *** 作步骤如下:

(1)点击设置。

(2)点击墙纸。

(3)点击选取新的墙纸。

(4)点击动态墙纸。

(5)点击现在要用的墙纸。

(6)点击设定。

(7)点击同时设定(主屏幕和锁定屏幕一起设定)即可。

当我们网络加载GIF,或者获取到本地GIF的数据data时,可以将data转换成动图UIImage

//获取动图

+ (UIImage *)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 =0i <counti++) {

            CGImageRef image =CGImageSourceCreateImageAtIndex(source, i, NULL )

            //获取单张动图时间间距

            duration += [ self  frameDurationAtIndex:i source:source]

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

            CGImageRelease(image)

        }

        //若未获取到时长,,自定义时长为0.1x张数,,这里可以根据需求自定义

        if (!duration) {

            duration = (1.0f/10.0f) * count

        }

        //创建动图

        animatedImage = [UIImage animatedImageWithImages:images duration:duration]

    }

    CFRelease(source)

    return  animatedImage

}

+ ( float )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]

        }

    } 

    CFRelease(cfFrameProperties)

    return  frameDuration

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11647532.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存