新聞中心
概覽
手勢修飾符用于處理用戶輸入事件 (例如,觸控) 處理所需的所有邏輯,并識別這類事件何時與已知的手勢模式 (例如,長按或旋轉(zhuǎn)) 匹配。在識別到模式時,SwiftUI 會運行一個回調(diào),供你用來更新視圖狀態(tài)或執(zhí)行操作。

將手勢修飾符添加到視圖
你添加的每個手勢都會應(yīng)用于視圖層次結(jié)構(gòu)中的特定視圖。若要識別特定視圖上的手勢事件,請創(chuàng)建并配置相關(guān)手勢,然后使用 gesture(_:including:) (英文) 修飾符:
struct ShapeTapView: View { var body: some View { let tap = TapGesture() .onEnded { _ in print("View tapped!") } return Circle() .fill(Color.blue) .frame(width: 100, height: 100, alignment: .center) .gesture(tap) } }
響應(yīng)手勢回調(diào)
每當(dāng)手勢狀態(tài)發(fā)生變化時,SwiftUI 都會根據(jù)你添加到手勢修飾符的回調(diào)反饋給你的代碼。手勢修飾符提供三種方式來接收更新:updating(_:body:) (英文)、onChanged(_:) (英文) 和 onEnded(_:) (英文)。
更新瞬時 UI 狀態(tài)
若要在手勢發(fā)生變化時更新視圖,請將 GestureState (英文) 屬性添加到你的視圖,并在 updating(_:body:) (英文) 回調(diào)中更新它。SwiftUI 會在識別到手勢以及手勢的值發(fā)生變化時立即調(diào)用更新回調(diào)。例如,SwiftUI 會在放大手勢一開始便調(diào)用更新回調(diào),然后在每次放大值發(fā)生變化時再次調(diào)用回調(diào)。SwiftUI 在用戶結(jié)束或取消手勢時不會調(diào)用更新回調(diào)。這時,手勢狀態(tài)屬性會自動將其狀態(tài)重置為初始值。
例如,若要創(chuàng)建一個在用戶執(zhí)行長按時改變顏色的視圖,請?zhí)砑右粋€手勢狀態(tài)屬性并在更新回調(diào)中更新它。
struct CounterView: View { @GestureState var isDetectingLongPress = false var body: some View { let press = LongPressGesture(minimumDuration: 1) .updating($isDetectingLongPress) { currentState, gestureState, transaction in gestureState = currentState } return Circle() .fill(isDetectingLongPress ? Color.yellow : Color.green) .frame(width: 100, height: 100, alignment: .center) .gesture(press) } }
在某個手勢期間更新永久狀態(tài)
若要跟蹤手勢的變化且在手勢結(jié)束后不應(yīng)重置,請使用 onChanged(_:) (英文) 回調(diào)。例如,若要對你的 App 識別長按的次數(shù)進(jìn)行計數(shù),請?zhí)砑右粋€ onChanged(_:) (英文) 回調(diào)并遞增計數(shù)器值。
struct CounterView: View { @GestureState var isDetectingLongPress = false @State var totalNumberOfTaps = 0 var body: some View { let press = LongPressGesture(minimumDuration: 1) .updating($isDetectingLongPress) { currentState, gestureState, transaction in gestureState = currentState }.onChanged { _ in self.totalNumberOfTaps += 1 } return VStack { Text("\(totalNumberOfTaps)") .font(.largeTitle) Circle() .fill(isDetectingLongPress ? Color.yellow : Color.green) .frame(width: 100, height: 100, alignment: .center) .gesture(press) } } }
在手勢結(jié)束時更新永久狀態(tài)
若要識別手勢在何時成功完成并檢索手勢的最終值,請在回調(diào)中使用 onEnded(_:) (英文) 函數(shù)來更新你的 App 的狀態(tài)。SwiftUI 僅在手勢成功時才會調(diào)用 onEnded(_:) (英文) 回調(diào)。例如,在一個 LongPressGesture (英文) 期間,如果用戶在經(jīng)過 minimumDuration (英文) 秒之前停止觸控視圖,或者他們的手指移動超過了 maximumDistance (英文) 點,則 SwiftUI 不會調(diào)用 onEnded(_:) (英文) 回調(diào)。
例如,若要在用戶完成長按后停止長按嘗試計數(shù),請?zhí)砑右粋€ onEnded(_:) (英文) 回調(diào)并有條件地應(yīng)用手勢修飾符。
struct CounterView: View { @GestureState var isDetectingLongPress = false @State var totalNumberOfTaps = 0 @State var doneCounting = false var body: some View { let press = LongPressGesture(minimumDuration: 1) .updating($isDetectingLongPress) { currentState, gestureState, transaction in gestureState = currentState }.onChanged { _ in self.totalNumberOfTaps += 1 } .onEnded { _ in self.doneCounting = true } return VStack { Text("\(totalNumberOfTaps)") .font(.largeTitle) Circle() .fill(doneCounting ? Color.red : isDetectingLongPress ? Color.yellow : Color.green) .frame(width: 100, height: 100, alignment: .center) .gesture(doneCounting ? nil : press) } } }
文章題目:創(chuàng)新互聯(lián)IOS教程:添加手勢互動操作
文章鏈接:http://m.fisionsoft.com.cn/article/djggopp.html


咨詢
建站咨詢
