Swift — 實作 The UX in Motion Manifesto 的動畫效果 Part.6

Dimensionality(空間維度)、Dolly & Zoom(移動鏡頭和縮放)

Jeremy Xue
6 min readJul 12, 2018

前言:

終於到了最後兩種動畫效果了,終於可以做點別的東西了( 雖然很喜歡做動畫,但是做得好膩,頭腦也要爆炸了 🤯🤯)

這次要實現的翻轉、翻牌效果與我們鏡頭縮放跟 Zoom in / out 效果,表面上看起來有點難以實現,但實際上實現並沒有想像中的難,就讓我們來做做看吧 💪🏻💪🏻💪🏻!!

Dimensionality(空間維度)

立體翻轉效果

通常我們會藉由翻轉一個立方體區塊或是一個平面物體,藉由翻轉到不同平面帶給使用者不同的畫面或是功能,然後藉由我們翻轉的動畫效果來作為他的動畫效果,敘述其翻轉的過程:

平面翻卡效果

在我們 Swift 中也有原生的轉場效果可以實現我們的翻轉動畫效果,這邊我們會使用 UIView.transition 方法中,將我們的 Option 選擇有 Flip( 翻轉 )的效果,就能實作我們的翻轉效果,下面我們簡單做一個翻卡的動畫:

當然別忘了也要做一個讓卡片翻回去效果,如此一來我們就有簡單的翻卡動畫效果了,( 這邊因為我們卡片大小不同,所以被切掉 ):

翻卡效果

我後面還有一個範例來做 TableView 的翻轉範例,在第一次進入畫面的時候會每個可見的 cell( visibleCells )來執行飛入翻轉的效果;也可以額外點擊 cell 來做翻轉的效果,有興趣的可以看 Demo 參考一下:

TableView 飛入旋轉動畫

Dolly & Zoom(移動鏡頭和縮放)

左邊是 Dolly 效果 右邊是 Zoom 效果

我想大概都知道 Zoom in / out 要如何實作,因為就是簡單的畫面縮小的概念,但是,對於 Dolly 的鏡頭縮放效果可能大概就不知道如何下手,我們先看一下 Dolly 效果的展示:

左方為 Dolly 效果;右方為 Zoom 效果

你可以看得出來, Dolly 效果的物件的距離跟使用者畫面之間的距離,那麼這個「 距離 」在使用者的畫面上實際上只感覺到物件的大小改變,因為遠的物件看起來小,越近的物件則看起來越大。所以說穿了,他們兩者實現方式是一樣的。

Dolly & Zoom 都是透過放大縮小的方式帶給使用者這兩種動畫效果,只是 Dolly 效果必須考慮到更多畫面上的東西,而 Zoom 只要考慮到元件本身。

那麼說穿了他的實作原理,接下來我們就來實作他吧!

#Dolly

Dolly 效果的主畫面

首先我們要做一個畫面拉近的效果,因為我們需要拉近畫面上所有元件的距離( 也就是放大 ),所以我們會將這個畫面的元件包在一個 View 中:

將畫面上元件放到 LoginView 中

之後只要對這個元件進行放大的變形效果就等於整個畫面放大,效果如下:

將整個 View 放大效果

這時後,你可能會覺得…

阿不就是放大而已,哪來的鏡頭遠近??

等等先別走,一個變形不夠,你有用過兩個嗎?一個 View 變大不夠,你有用過兩個嗎?

var anotherView:UIView!

因此我們在 ViewDidLoad 也創建了一個 View 來做為我們登入成功的畫面,關於他的設置方式我們用程式碼來說明:

這時我們在我們一開始的縮放的方法多設置一個 anotherView 的動畫效果,讓他變成我們原始大小即可:

別忘了做縮回去的效果R~接下來看我們的效果吧:

# Zoom

這邊我用就用可能最常使用的地方來實作這個效果,首先我們規劃用 CollectionView 做一個相簿,並且點到該張相片,相片會移動至中央並放大,在這邊我們會順便加上上一期的模糊效果來凸顯我們的照片:

首先我大概說一下實作方式,當我們點選到 Cell 之後:

  • 會產生一個與我們 cell 圖片、大小都相同的 ImageView
  • 產生一個模糊的畫面遮住 CollectionView
  • 並會有一個關閉視窗的按鈕
  • 圖片放大移動至中央的動畫

接下來我用程式碼解釋過程:

接下來看一下我們最後的成品吧:

相簿 Zoom in 效果

後記

終於將這 12 種增進易用性的動畫規範作完了,說長不長,說難很難。但也吸收到許多有關動畫的知識,也發現 Swift 中有很多原生的動畫效果可以實現( 感謝我大蘋果🍎 ),透過這次實作也能順便檢討自己實作動畫的缺點,並且改進它,也希望大家看完這系列的文章可以有些收穫!!

附上最後一次的 Github 連結:

--

--

Jeremy Xue
Jeremy Xue

Written by Jeremy Xue

Hi, I’m Jeremy. [好想工作室 — iOS Developer]

No responses yet