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