iOS用Sketch制作APP下拉刷新的GIF動畫

zouyang 8年前發布 | 42K 次閱讀 iOS開發 移動開發

前言

中秋三天就這么睡過去了~~這也不能怪我,聽說深圳連飛機都吹跑了,嚇死寶寶了。

節假日一過總會留下后遺癥,但是為了錢途,咱們是要挺直腰桿,接著敲代碼。。

一、用Sketch結合MJRefresh來自定義刷新動畫

今天分享一下iOS關于自定義下拉刷新動畫的實現。我們平時看到很多APP的下拉刷新都是菊花在轉的樣式,因為很多APP都是用 MJRefresh 默認下拉刷新來實現的。但是,我們也會看到不少APP的下拉刷新很有特色,像 美團、分期樂、喵播 等等。

他們的刷新樣式同樣是用 MJRefresh 來實現的, MJRefresh 有一個類 MJRefreshGifHeader ,自定義這個類可以將GIF圖片集合制作成下拉刷新的動畫。但是他的前提是得制作出一個GIF圖片集合。

這個軟件不僅能夠做靜態的UI圖,還能做動態的GIF圖。前段時間我嘗試用Sketch做一個GIF動畫,無意間被我發現了一個很好用的插件 AnimateMate ,這個插件使用javaScript寫的,但這不影響我們的使用,關于這個插件的使用可以去這個網站看視頻 AnimateMate視頻教程 。我們用Sketch ToolBox安裝完插件之后就可以使用了。

這里我以分期樂的刷新動畫為例進行講解。這個是最后集成到項目中的效果:

最終效果圖.gif

下面我就分兩個大的步驟來給大家講解一下如何讓自己的APP有一個專屬的下拉刷新動畫(當然,如果動畫比較復雜的用CoreAnimation會更簡單,這里介紹的只是圖片比較復雜,但動畫比較簡單的):

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為369°

    創建動畫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 = MBRefreshGifHeader.init { 
            // loading data
        }
}

總結

Sketch不僅能夠制作UI圖,也能制作GIF動畫。我這里只是舉了個例子,使用AnimationMate這個插件來做GIF動畫真的很方便,但也有很多局限性。目前這款插件只能做一些線性的動畫效果,像 Position 、 Size 、 Transform 、 Opacity 等。如果要做一些比較復雜的動畫那用AnimationMate就不太合適了。

 

 

來自:http://www.jianshu.com/p/45022427cf96

 

 本文由用戶 zouyang 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!