美文网首页项目经验iOS图形处理相关iOS Collection
iOS用Sketch制作APP下拉刷新的GIF动画

iOS用Sketch制作APP下拉刷新的GIF动画

作者: peaktan | 来源:发表于2016-09-18 17:08 被阅读8429次

    前言

    中秋三天就这么睡过去了~~这也不能怪我,听说深圳连飞机都吹跑了,吓死宝宝了。
    节假日一过总会留下后遗症,但是为了钱途,咱们是要挺直腰杆,接着敲代码。。

    一、用Sketch结合MJRefresh来自定义刷新动画

    今天分享一下iOS关于自定义下拉刷新动画的实现。我们平时看到很多APP的下拉刷新都是菊花在转的样式,因为很多APP都是用MJRefresh默认下拉刷新来实现的。但是,我们也会看到不少APP的下拉刷新很有特色,像美团、分期乐、喵播等等。

    他们的刷新样式同样是用MJRefresh来实现的,MJRefresh有一个类MJRefreshGifHeader,自定义这个类可以将GIF图片集合制作成下拉刷新的动画。但是他的前提是得制作出一个GIF图片集合。

    在我的上一篇文章iOS工程师Mac上的必备软件中我介绍了一款UI软件Sketch。这个软件相信大多数人都接触过(如果你还不会用,那么可以看我的上一篇文章,里面有教程链接)。这个软件不仅能够做静态的UI图,还能做动态的GIF图。前段时间我尝试用Sketch做一个GIF动画,无意间被我发现了一个很好用的插件AnimateMate,这个插件使用javaScript写的,但这不影响我们的使用,关于这个插件的使用可以去这个网站看视频AnimateMate视频教程。我们用Sketch ToolBox安装完插件之后就可以使用了。

    这里我以分期乐的刷新动画为例进行讲解。这个是最后集成到项目中的效果:

    最终效果图.gif

    下面我就分两个大的步骤来给大家讲解一下如何让自己的APP有一个专属的下拉刷新动画 :

    1. 用Sketch制作GIF动画
    2. 用MJRefreshGifHeader来集成下拉刷新动画
    

    二、用Sketch制作GIF动画

    1. Sketch安装插件AnimateMate
    2. 打开Sketch新建一个画板,命名为refresh,把你要画的图形放到画布上
    新建画布.png
    3. 接下来是按照图形把分期乐的猫头鹰画出来

    先分析一下这个猫头鹰:

    1.先用钢笔工具把头和脸的形状画出来,再进行贝兹曲线变形
    2.用铅笔工具把头发画出来
    3.鼻子就是两个三角形
    4.眼睛就是三个圆
    5.翅膀就是一个矩形弄成圆角
    6.身体就是三个圆
    7.脚是三个矩形组成的
    
    1. 选择钢笔工具


      选择贝兹曲线.png
    2. 用钢笔工具沿着头部描7个点,最后重合第1个点和第7个点重合


      用钢笔工具描点.png
    3. 对线条进行编辑


      选中线条点击Edit.png
    4. 分别选中第3个点和第6个点进行贝兹曲线变形


      头部进行贝兹曲线变形.png
    5. 接下来再用同样的方式把脸部的关键点描出来


      用钢笔工具把脸部的关键点描出来.png
    6. 对脸部的第2、5、7这三个点进行贝兹曲线变形


      对脸部进行贝兹曲线变形.png
    7. 把眼睛和鼻子画出来


      画鼻子和眼睛.png
    8. 用一个矩形把翅膀画出来


      画翅膀.png
    9. 改变翅膀的圆角为100


      修改翅膀圆角.png
    10. 用三个圆把身体画出来


      .画身体png
    11. 用6个矩形把脚画出来


      画脚.png
    12. 接下来就是头发了,头发我们用铅笔工具直接画出来,铅笔工具不好把握,有一点偏差也没事


      用铅笔画头发.png
      画出头发.png
    13. 最后把下面的图形移到旁边,用取色的方式对各个部位填充颜色,然后把边界都去掉(注意图层的位置,如果遮挡住了,通过移动图层来使其摆放在正确的图层)


      我下面图片移开.png
    14. 这样就把猫头鹰给画出来,接下来就是制作动画。


      最终画出来的图形.png
    4. 用AnimationMate来制作动画
    1. 先把整个猫头鹰按照比例调整到宽为56的大小,画板调整到宽高都为60的大小


      修改猫头鹰大小和画布大小.png
    2. 将眼睛的黑色部分和大白色的圆建成一个组


      合并成组.png
    3. 选中所有图层->plugins->AnimateMate->Creat Animateion


      创建动画1.png
    4. 创建第0帧的动画。KeyframeNumber为0,EasingType动画类型为线性动画linearEase。


      创建动画2.png
    5. 改变eye_right和eye_left的Transform为359°


      创建动画3.png
    6. 选中所有图层->plugins->AnimateMate->Creat Animateion,我们让这个猫头鹰的眼睛从0°旋转到359°分成20个关键帧。KeyframeNumber为20,EasyingType为线性动画linearEase,点击OK。


      创建动画4.png
    7. 选中refresh图层->plugins->ExportAnimation导出动画


      导出动画1.png
    8. 可以看到,这里我们可以导出GIF Aniamtion动图,也可以直接导出20个PNG图片。我们都勾选上,然后给导出的GIF图和PNG图填一个前缀名字fenqile_refresh。选择导出出到fenqile_refresh文件夹


      导出动画2.png
    9. 导出之后的结果为下图所示。有20张png图片和一个gif动图。


      最后导出的结果.png
    10. 用浏览器打开gif动图可以看到最终实现的效果。


      最终实现的效果.gif

    至此用Sketch就把这个GIF动图给制作完成了,接下来就是要用MJRefresh来自定义下拉刷新样式了

    三、用MJRefreshGifHeader来自定义下拉刷新样式

    1. 将20个png图片导入到Xcode工程


      将图片导入工程.png
    2. 创建一个类CustomRefreshGifHeader继承自MJRefreshGifHeader

    import UIKit
    import MJRefresh
    
    class CustomRefreshGifHeader: MJRefreshGifHeader {
    
        // MARK: 重写父类方法
        
        /**
         在这里做一些初始化配置(比如添加子控件)
         */
        override func prepare() {
            super.prepare()
            var images = [UIImage]()
            for i in 0...20 {
                if i < 10 {
                    images.append(UIImage.init(named: "fenqile_refresh_0\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\(i)")!)
                }else {
                    images.append(UIImage.init(named: "fenqile_refresh_\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\(i)")!)
                }
            }
            
            self.setImages(images, duration: 1.2, forState: MJRefreshState.Refreshing)
            self.setImages([UIImage.init(named: "fenqile_refresh_00")!], forState: MJRefreshState.Pulling)
            self.setImages([UIImage.init(named: "fenqile_refresh_00")!], forState: MJRefreshState.Idle)
            self.lastUpdatedTimeLabel.hidden = true
            
            self.stateLabel.font = UIFont.systemFontOfSize(10)
            self.setTitle("释放即可刷新", forState: MJRefreshState.Pulling)
            self.setTitle("下拉刷新", forState: MJRefreshState.Idle)
            self.setTitle("刷新中", forState: MJRefreshState.Refreshing)
        }
        
        /**
         在这里设置子控件的位置和尺寸
         */
        override func placeSubviews() {
            super.placeSubviews()
            
            self.gifView.contentMode = UIViewContentMode.Center
            self.gifView.frame = CGRect.init(x: 0, y: 4, width: self.mj_w, height: 34)
            self.stateLabel.frame = CGRect.init(x: 0, y: 40, width: self.mj_w, height: 14)
        }
    }
    

    3.给TableView添加下拉刷新

    override func viewDidLoad() {
            super.viewDidLoad()
            tableView = UITableView(frame: CGRect(x: 0, y: 0, width: SCREEN_WIDTH, height: SCREEN_HEIGHT), style: UITableViewStyle.Grouped)
            view.addSubview(tableView)
            tableView.mj_header = CustomRefreshGifHeader.init { 
                // loading data
            }
    }
    

    总结
    Sketch不仅能够制作UI图,也能制作GIF动画。我这里只是举了个例子,使用AnimationMate这个插件来做GIF动画真的很方便,但也有很多局限性。目前这款插件只能做一些线性的动画效果,像 PositionSizeTransformOpacity等。如果要做一些比较复杂的动画那用AnimationMate就不太合适了。
    这篇文章没有重点讲解AnimationMate的其他使用。接下来我会出一篇关于这个插件的详细使用教程。

    马上来为你的APP制作炫酷的刷新动画吧,说不定你们老板会给你涨工资呢~~。

    喜欢的话可以点个赞。

    相关文章

      网友评论

      • 西叶lv:转行设计,O(∩_∩)O~
        peaktan:@郝嘉律 :smile:
      • 2fd62afe4498:有办法透明gif背景么,我artboard设置成透明或者不勾选,导出的GIF就不动。。
      • 何康老鬼:啥都会啊 厉害
      • 某非著名程序员:你这美工的活也干的溜
      • 只有NO1:我一导出 肚子 就偏了怎么回事啊 :scream:
        peaktan:@只有NO1 你动画没弄对
      • 4814194b0796:高手啊!
      • 353dea46488b:以实现这个demo,期待这个插件的详细教程!!其他的功能还在摸索!
      • 727eacd06b43:楼主 能分享个demo吗
        peaktan:@李先森_ 关键代码都贴出来了。
      • JopYin:谢谢楼主
      • JopYin:楼主demo能分享给我吗?
        peaktan:@JopYin 可以,等过些天回公司了分享给你。现在请假了:fearful:
      • 薛凯凯圆滚滚:你好~根据你说的设置, 我的图片出来了。但是特别大 使用MJ 是3.1.12版本 。 但是根据你说的修改gifView的.frame 居然 没有效果图片还是那么大,它好像只是修改了图片外层的父视图。请问我是不是还有什么没有设置 没办法调小图片?
        peaktan:@薛凯凯圆滚滚 gifview是用来承载gif图片view的。mj内部的imageview是按图片原大小来现实的,你可以修改源码,或者就是我说的方案。
        薛凯凯圆滚滚:@wythetan 其实我是想问那个gifView不能修改图片大小了吗?我的那个图片放出来帧很慢,不知道是不是大的原因,能改大小的话肯定比修改图片好多了
        peaktan:@薛凯凯圆滚滚 将图片放在两倍图@2x的位置。因为我是根据6s的屏幕大小导出图片的
      • 剁椒鱼尾:sdweb 有image +gif 的分类
      • DDDDeveloper:加油
        peaktan:@一个有前途的男人 :fist:
      • 727eacd06b43:gif怎么导出一帧帧的图片?直接用gif的不信吗
        wsj2012: @李先森_ uuuuuuuuuuuu
        peaktan:@李先森_ 导出的时候勾选png就可以每一帧的图片了。
      • 炙冰:怎么是swift的,我还没学到!!! :disappointed_relieved:
        ef8e67862ffe:@wythetan 没那么夸张吧,之前1.0,2.0版本都不够稳定,现在3.0可以用了。
        炙冰:@wythetan 我才刚学不久,估计马上就会学到了!顺便问一下,大神,swift语言和oc有什么大区别吗?
        peaktan:@炙冰 现在iOS不会swift都找不到工作了:flushed:
      • 清無:AnimateMate。。。
      • 孤独的根号五:路子真野。。。
      • 3c8d56c8937a:挺好的。。
      • 咋了爸爸:楼主 有demo吗 方便给一个demo吗
        咋了爸爸:@wythetan 好的 谢谢 你现在做的这个demo方便发我一份吗
        peaktan:@咋了爸爸 下篇文章我会分享一下这个插件的详细使用:flushed:
        peaktan:@咋了爸爸 这个找着操作就行了。如果需要demo,我会贴在下一篇文章,这段时间都在适配10:sleepy:
      • pseudo_niaonao:已分享
      • 9808f2c53707:新技能get:smile:
      • 小明大神:新技能get:smile:

      本文标题:iOS用Sketch制作APP下拉刷新的GIF动画

      本文链接:https://www.haomeiwen.com/subject/wzjwettx.html