使用SwiftUI搭建一個風箏搖擺動畫,實現放風箏的夢想~
theme: smartblue
我正在參與掘金創作者訓練營第5期, 點選瞭解活動詳情。
在本章中,你將學會使用SwiftUI
建立一個風箏搖擺動畫。
前言
為了更加熟悉和了解SwiftUI
,本系列將從實戰角度出發完成100個SwiftUI專案,方便大家更好地學習和掌握SwiftUI
。
這同時也是對自己學習SwiftUI
過程的知識整理。
如有錯誤,以你為準。
專案背景
有一次週末在海邊晃悠,抬頭看到好多風箏在天空自由的翱翔,有些風箏一節接著一節在空中搖盪甚是壯觀。
突然腦海裡有了些許靈感,是不是可以把這個景象使用SwiftUI做一個動畫?
說幹就幹。
專案搭建
首先,建立一個新的SwiftUI
專案,命名為MagicAnimation
。
頁面樣式
首先是圖片部分,這裡我們可以使用Apple
官方提供的系統圖標
作為展示的樣式,也可以使用匯入的圖片作為樣式設計的元素,示例:
Image(systemName: "heart.circle")
.font(.system(size: 32))
.foregroundColor(.purple)
為了實現翻頁切換效果,我們需要宣告一個變數作為切換,示例:
@State var isSwitch:Bool = false
宣告好變數isSwitch
後,我們根據isSwitch
的狀態可以設定切換Image
圖示圖片和圖片填充顏色,示例:
Image(systemName: isSwitch ? "heart.circle.fill" : "heart.circle")
.font(.system(size: 32))
.foregroundColor(isSwitch ? .red : .purple)
當我們把isSwitch
變成true
時,預覽效果如下:
接下來,我們通過ForEach
迴圈遍歷多一些圖片,示例:
HStack{
ForEach(0..<8) { num in
Image(systemName: isSwitch ? "heart.circle.fill" : "heart.circle")
.font(.system(size: 32))
.foregroundColor(isSwitch ? .red : .purple)
}
}
上述程式碼中,我們使用HStack
橫向佈局和ForEach
迴圈,遍歷展示了8個
圖示圖片。
至此,我們的樣式部分就完成了。
互動動畫
由於我們需要使用拖動動畫,我們先宣告一個變數來儲存拖動的位置,示例:
@State private var dragAmount = CGSize.zero
然後在Image
加上一個偏移修飾符,並且增加拖動動畫,示例:
HStack {
ForEach(0 ..< 8) { num in
Image(systemName: isSwitch ? "heart.circle.fill" : "heart.circle")
.font(.system(size: 32))
.foregroundColor(isSwitch ? .red : .purple)
.offset(self.dragAmount)
}
}
.gesture(
DragGesture()
.onChanged { self.dragAmount = $0.translation }
.onEnded { _ in
self.dragAmount = .zero
self.isSwitch.toggle()
}
)
上述程式碼中,我們給Image
添加了一個偏移量修飾符offset
,偏移位置為dragAmount
。
然後給HStack
整個橫向檢視增加拖動動畫DragGesture
,在拖動時,更改偏移量的位置為拖動的位置,在拖動結束時,我們將檢視復位dragAmount
到初始位置zero
,並且切換樣式狀態isSwitch
。
好像看起來效果一般,不夠優雅。
我們再加一個互動動畫,讓幾個Image
有延遲錯落感,示例:
.animation(
Animation.default.delay(Double(num) / 20), value: dragAmount
)
專案展示
本章程式碼
``` import SwiftUI
struct ContentView: View { @State var isSwitch: Bool = false @State private var dragAmount = CGSize.zero
var body: some View { HStack { ForEach(0 ..< 8) { num in Image(systemName: isSwitch ? "heart.circle.fill" : "heart.circle") .font(.system(size: 32)) .foregroundColor(isSwitch ? .red : .purple) .offset(self.dragAmount) .animation( Animation.default.delay(Double(num) / 20), value: dragAmount ) } } .gesture( DragGesture() .onChanged { self.dragAmount = $0.translation } .onEnded { _ in self.dragAmount = .zero self.isSwitch.toggle() } ) } } ```
恭喜你,完成了整個專案的全部內容!
快來動手試試吧。
如果本專欄對你有幫助,不妨點贊、評論、關注~
- 實戰教程·元宇宙來了,準備好你的電子名片了嗎?(一)
- 實戰教程·元宇宙來了,準備好你的電子名片了嗎?(八)
- 實戰教程·什麼年代了還在敲傳統木魚?(二)
- 實戰教程·元宇宙來了,準備好你的電子名片了嗎?(七)
- 實戰教程·元宇宙來了,準備好你的電子名片了嗎?(六)
- 實戰教程·元宇宙來了,準備好你的電子名片了嗎?(五)
- 實戰教程·元宇宙來了,準備好你的電子名片了嗎?(四)
- 實戰教程·元宇宙來了,準備好你的電子名片了嗎?(三)
- 實戰教程·元宇宙來了,準備好你的電子名片了嗎?(二)
- 實戰教程·什麼年代了還在敲傳統木魚?(一)
- 技術下午茶:產品經理是如何工作的?如何才算一份好的需求文件?如何設計一個簡單的列表,它應該具備哪些基本功能?
- 釋出&選擇釋出,使用SwiftUI搭建一個新建釋出彈窗(上)
- 釋出&選擇釋出,使用SwiftUI搭建一個新建釋出彈窗(下)
- 使用SwiftUI搭建一個風箏搖擺動畫,實現放風箏的夢想~
- SwiftUI100天:使用SwiftUI搭建一個計時器App
- 實戰程式設計·使用SwiftUI從0到1完成一款iOS筆記App(三)
- 初識MVVM·關於啟動頁、引導頁、登入頁的設計細節和互動邏輯
- 誰說程式設計師不懂浪漫,教你使用SwiftUI搭建一個電子相簿送給她吧~
- 實戰程式設計·刻在男人DNA裡的浪漫,空氣投籃(二)
- 實戰程式設計·使用SwiftUI從0到1完成一款iOS筆記App(四)