使用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(四)