Timer自動換圖、UISegmentedControl 、Scroll View、AVPlayerLooper背景音樂播放(Market02)

Ahri
彼得潘的 Swift iOS / Flutter App 開發教室
6 min readApr 20, 2024

完善上一篇文章畫面如下(有些忘記操作請看YT 連結):

完整音樂跟Scroll View:

下面一樣為了方便大家使用,每個功能會獨立出來,也方便閱讀 。

1.Timer自動換圖

自動換圖物件

//上一篇有建立Image---------所以這裡省略建立--//

var autoImage: Timer?

override func viewDidLoad() {
super.viewDidLoad()

//設定一開始圖案顯示哪一張,因為上面有宣告index=0所以這邊會index會從0開始
changePicture.image = UIImage(named: pictureArray[index])

//timer每三秒往下換一張圖,跟著 @objc func updatePicture()配合著一起看
autoImage = Timer.scheduledTimer(timeInterval: 3.0, target: self,
selector: #selector(updatePicture), userInfo: nil, repeats: true)
}

//這是為了離開此頁要關掉這個timer
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
autoImage?.invalidate()
}

2.UISegmentedControl -> Scroll View

我建立了三個視窗,分別售賣不同商品,因為背景顏色設置透明,所以預覽畫面才會疊在一起,ScrollView設定在我的其他文章有,這邊不贅述。

以下是SegmentedControl控制三個scrollView的顯示方式:

    @IBOutlet weak var segment: UISegmentedControl!
@IBAction func segmentAction(_ sender: UISegmentedControl) {
// 先將所有的 UIScrollView 隱藏
scrollStone.isHidden = true
scrollFlower.isHidden = true
scrollJade.isHidden = true

//點選按鈕後,對應的畫面“不隱藏“所以就會出現
switch sender.selectedSegmentIndex{
case 0:
scrollStone.isHidden = false
case 1:
scrollFlower.isHidden = false
case 2:
scrollJade.isHidden = false
default:break
}

//為了打開app有顯示某個畫面所以要先打開第一個

override func viewDidLoad() {
super.viewDidLoad()
// 預設顯示 scrollStone,隱藏其他兩個 UIScrollView
scrollStone.isHidden = false
scrollFlower.isHidden = true
scrollJade.isHidden = true
}

4.AVPlayerLooper背景音樂播放

因為我很「ㄏㄧ 花」 所以我很喜歡放一些有的沒的讓我的作品更豐富,背景音樂是去網路上找免費,然後剪輯製作而成(P圖、特效、製作一條龍呢):

import AVFoundation
//背景音樂循環播放-------------------//
var looper: AVPlayerLooper?

override func viewDidLoad() {
super.viewDidLoad()


// 使用Bundle.main.url(forResource:withExtension:)方法來查找指定的背景音樂檔案
if let url = Bundle.main.url(forResource: "backgroundMusic", withExtension: "mp3"){

// 使用獲取到的URL初始化AVQueuePlayer對象
let player = AVQueuePlayer()
let item = AVPlayerItem(url: url)
looper = AVPlayerLooper(player: player, templateItem: item)
player.play()
}
}

補充-清除建制做

提示:把畫面所有數量「文字」改成”0"就行了。

以下是記錄一下學程式到現在的感想,趕時間的可以跳過:

很多東西真的卡住的時候很難懂,如果真的看不懂某個東西,或你不知道它可以用在哪,先跳過。不要鑽牛角尖,因為會抹滅你的興趣跟成就感,「先做出來」最重要(這是一位資深開導我的話)。

常常也會覺得,我只是一個抄code的無情機器,但是學習不是就是這樣嗎? 都是從模仿開始,別急呀夥伴們,這句話對你們說也對自己說。

先「會用」所有東西,用著用著,一些東西就在你腦海裡了,腦神經連結也是需要時間讓他長出那條神經的(另外一位資深跟我說的話)。

希望我成功進入職場後,再回來回憶學習歷程,如果覺得原來當初我也有青澀的時候,那就代表我成功了~

--

--