Swift — 做個播放器吧(規劃&介面篇)
因為某些緣故,最近需要嘗試練習一下做一個音樂播放器,之前只有練習過簡單的音效播放( DJ Pad 或小木琴等等 ),但覺得應該差不了多少,只是可能注意的點要更多一些,那讓我們來動手做一個音樂播放器吧!
功能規劃:
當天我在紙上規劃了一些可能一個播放器基本功能,也額外加上了一些附加的功能,如果有餘裕可以試著擴充功能:
介面:
你可以去市面上早一個你喜歡的音樂播放器的版面來設計,或者是你要設計一個也行:
這邊你會看到會有許多顏色不同的區塊,是我用許多 View 來分隔各自的範圍,為了讓大家清楚劃分位置,所以使用顏色區分,別忘了設定 AutoLayout 呦。
這下來我們將畫面與程式碼連結,來美化一下我們的音樂播放器版面,在這邊我們會有下列幾個操作,下面我們會個別幾個定義方法操作這些效果:
- 修改 StatusBar 顏色
- 添加漸層顏色背景
- 添加播放器按鈕、歌曲圖片的圓角+框線效果
- 添加歌曲圖片以及歌曲資訊區域陰影效果
修改 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).cgColorlet 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:
這時候你應該會看到我們的程式碼的的宣告類型會變成 [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 已經有陰影效果了,但圖片卻沒出現陰影?
那是因為我們在切圓角的時候,我們使用到了 clipsToBounds ,所以可以想像超過這張圖片以外的都被裁切掉了,那麼這時該如何做出陰影效果呢?
我這邊使用一個非常懶人的解法,如果有更好的解法請大大們不吝嗇的提供給我知道謝謝
這邊我的 ImageView 其實放在一個 View 裡面,所以我其實是對不同地方做個別的效果,所以我只要對他下面的 View 做陰影,上面的 ImageView 切圓角就能完成我們想要的效果了:
那我們的【做個播放器吧】第一部份應該就到這邊結束了,之後會來實作播放器的功能。