這篇文章主要了解在SwiftUI中如何使用手勢,以及對(duì)@GestureState的學(xué)習(xí)疗涉,最后通過組合手勢完成寫一個(gè)拖拽卡片的小Demo。
Gesture modifier
SwiftUI提供了一系列的手勢支持吟秩,比如 TapGesture, DragGesture, RotationGesture, MagnificationGesture, LongPressGesture等咱扣。我們可以通過對(duì)View添加modifier來增加手勢支持,比如下面這塊代碼:
示例中涵防,我們聲明一個(gè)@GestureState修飾的布爾變量闹伪,來存儲(chǔ)當(dāng)前的長按狀態(tài),當(dāng)被按下的時(shí)候更新view的背景色及大小壮池。通過對(duì)Gesture增加update調(diào)用來更新isLongPressed偏瓤,進(jìn)而更新對(duì)應(yīng)的View。此外我們在更新isLongPressed的閉包中增加了對(duì)value的打印椰憋,每次按下的時(shí)候都會(huì)將isLongPressed更新為true厅克,在手勢結(jié)束的時(shí)候自動(dòng)將綁定的屬性恢復(fù)為初始值。我們可以看下update的方法聲明:
DragGesture
在前一小結(jié)的基礎(chǔ)上橙依,我們將通過DragGesture來實(shí)現(xiàn)對(duì)色塊的拖動(dòng)证舟,在拖動(dòng)結(jié)束后硕旗,檢查拖動(dòng)后的位置,如果超出了屏幕范圍女责,則恢復(fù)到初始位置漆枚,否則停留在拖動(dòng)結(jié)束的位置。通過前一小結(jié)學(xué)習(xí)到抵知,在手勢結(jié)束時(shí)SwiftUI會(huì)自動(dòng)將@GestureState修飾的屬性值恢復(fù)為初始值浪读,在這里為了避免拖動(dòng)結(jié)束時(shí)自動(dòng)恢復(fù)到初始位置,我們使用@State來修飾View的拖動(dòng)位置屬性辛藻。代碼實(shí)現(xiàn)如下:
Composing gestures
SwiftUI提供了三種組合手勢的方式來支持對(duì)View添加多個(gè)手勢的場景。分別為Simultaneous互订、Sequenced吱肌、Exclusive;當(dāng)使用Simultaneous時(shí)SwiftUI會(huì)同時(shí)執(zhí)行所有的手勢仰禽、當(dāng)使用Sequenced時(shí)會(huì)按照順序線性的執(zhí)行氮墨、當(dāng)使用Exclusive時(shí)就只會(huì)執(zhí)行子手勢。以下示例使用Simultaneous組合了LongPressGesture和DragGesture吐葵。