Swift — 做個播放器吧(規劃&介面篇)

Jeremy Xue
7 min readJun 10, 2018

--

因為某些緣故,最近需要嘗試練習一下做一個音樂播放器,之前只有練習過簡單的音效播放( DJ Pad 或小木琴等等 ),但覺得應該差不了多少,只是可能注意的點要更多一些,那讓我們來動手做一個音樂播放器吧!

功能規劃:

當天我在紙上規劃了一些可能一個播放器基本功能,也額外加上了一些附加的功能,如果有餘裕可以試著擴充功能:

紙上規劃播放器功能

介面:

你可以去市面上早一個你喜歡的音樂播放器的版面來設計,或者是你要設計一個也行:

Storyboard 音樂播放器播放器雛形

這邊你會看到會有許多顏色不同的區塊,是我用許多 View 來分隔各自的範圍,為了讓大家清楚劃分位置,所以使用顏色區分,別忘了設定 AutoLayout 呦。

這下來我們將畫面與程式碼連結,來美化一下我們的音樂播放器版面,在這邊我們會有下列幾個操作,下面我們會個別幾個定義方法操作這些效果:

  1. 修改 StatusBar 顏色
  2. 添加漸層顏色背景
  3. 添加播放器按鈕、歌曲圖片的圓角+框線效果
  4. 添加歌曲圖片以及歌曲資訊區域陰影效果

修改 Status Bar 顏色

這部分可以去參考我的文章—— 【Swift — 玩玩 Status Bar 狀態列】,這邊我是設置全局的 Status Bar 為 Light:

添加漸層顏色背景:

關於漸層之後可能會發一篇文章介紹一下,這邊就利用簡單兩個顏色來製作漸層效果作為我們的背景,我把這些方式個別獨立到一個方法中:

// Make a gradient backgroundfunc setGradientLayer() {// 設定漸層顏色
let color1 = colorLiteral(red: 0.631372549, green: 0.5490196078, blue: 0.8196078431, alpha: 1).cgColor
let color2 = colorLiteral(red: 0.9843137255, green: 0.7607843137, blue: 0.9215686275, alpha: 1).cgColor
let gradientLayer = CAGradientLayer()
gradientLayer.frame = view.frame
// color1 為第一個漸層色,color2 為第二個漸層色。
gradientLayer.colors = [color1,color2]
把 gradientLayer 插入我們的 view 的 Layer 中。
view.layer.insertSublayer(gradientLayer, at: 0)
}

然後之後我們可以在 viewDidLoad 呼叫這個方法,就可以看到我們兩個顏色的漸層背景囉!是不是覺得馬上變得很有質感( 誤 )

加上漸層色背景效果

添加播放器按鈕、歌曲圖片的圓角+框線效果

這邊我也為圓角效果定義一個方法,只要我有需要切圓角+框線的元件,我就讓該元件套用我這個方法就能有這兩種效果:

// Make circle shape & border// 這邊以一個參數 object 類型為 UIView,因為大部分元件都為 UIView 的 subClass( 我們這邊的元件就為 UIImageView 跟 UIButton ),因此,他們可以套用到此方法中。func makeCircle(object:UIView) {object.layer.cornerRadius = 20
object.clipsToBounds = true
object.layer.borderWidth = 3
object.layer.borderColor = UIColor.white.cgColor
}

因此,假如我的 songImage 類型為 UIImageView 想要套用圓角和框線效果,那麼我就可以套用此方法:

makeCircle(object: songImage)

小技巧

問題:假如我們播放器的播放/停止、上一首、下一首也需要套用該怎麼套用呢?

今天我們的按鈕只有三個,所以最簡單的方法就是一個一個套用此方法,但假如我們今天按鈕有 100 個甚至更多,該如何解決?

這時,我們可以讓該元件與程式碼連結的時候,我們選擇 Outlet Collection:

選擇 Outlet Collection

這時候你應該會看到我們的程式碼的的宣告類型會變成 [UIButton],變成一個類型為 [UIButton] 的 Array:

播放器的按鈕們與程式碼連結

之後,可以把其他播放器的按鈕也加到這個與這段程式碼連結,之後我們就可以透過 for 迴圈,來把這裡面所有的按鈕套用上面的方法:

@IBOutlet var playerButton: [UIButton]! {  didSet {     for button in playerButton {
makeCircle(object: button)
}
}
}

這麼一來,所有在這個 playerButton 陣列中的按鈕都會套上圓角和框線效果:

圖片及按鈕套用圓角及框線效果

添加歌曲圖片以及歌曲資訊區域陰影效果

這邊我們一樣也定義一個額外的方法來做陰影效果

func makeShadow(object:UIView,offset:CGSize){object.layer.shadowOffset = offset
object.layer.shadowColor = UIColor.black.cgColor
object.layer.shadowOpacity = 0.5
object.layer.shadowRadius = 10
}

我們將套用陰影效果到我們的圖片以及上半部的 View 的範圍中,但這時你會發現,我們上半部的 View 已經有陰影效果了,但圖片卻沒出現陰影?

ImageView 的陰影消失了

那是因為我們在切圓角的時候,我們使用到了 clipsToBounds ,所以可以想像超過這張圖片以外的都被裁切掉了,那麼這時該如何做出陰影效果呢?

我這邊使用一個非常懶人的解法,如果有更好的解法請大大們不吝嗇的提供給我知道謝謝

藏在 View 中的 ImageView

這邊我的 ImageView 其實放在一個 View 裡面,所以我其實是對不同地方做個別的效果,所以我只要對他下面的 View 做陰影,上面的 ImageView 切圓角就能完成我們想要的效果了:

成功加上陰影效果

那我們的【做個播放器吧】第一部份應該就到這邊結束了,之後會來實作播放器的功能。

--

--

Jeremy Xue
Jeremy Xue

Written by Jeremy Xue

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

No responses yet