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

將手勢(shì)修飾符添加到視圖
你添加的每個(gè)手勢(shì)都會(huì)應(yīng)用于視圖層次結(jié)構(gòu)中的特定視圖。若要識(shí)別特定視圖上的手勢(shì)事件,請(qǐng)創(chuàng)建并配置相關(guān)手勢(shì),然后使用 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)手勢(shì)回調(diào)
每當(dāng)手勢(shì)狀態(tài)發(fā)生變化時(shí),SwiftUI 都會(huì)根據(jù)你添加到手勢(shì)修飾符的回調(diào)反饋給你的代碼。手勢(shì)修飾符提供三種方式來接收更新:updating(_:body:) (英文)、onChanged(_:) (英文) 和 onEnded(_:) (英文)。
更新瞬時(shí) UI 狀態(tài)
若要在手勢(shì)發(fā)生變化時(shí)更新視圖,請(qǐng)將 GestureState (英文) 屬性添加到你的視圖,并在 updating(_:body:) (英文) 回調(diào)中更新它。SwiftUI 會(huì)在識(shí)別到手勢(shì)以及手勢(shì)的值發(fā)生變化時(shí)立即調(diào)用更新回調(diào)。例如,SwiftUI 會(huì)在放大手勢(shì)一開始便調(diào)用更新回調(diào),然后在每次放大值發(fā)生變化時(shí)再次調(diào)用回調(diào)。SwiftUI 在用戶結(jié)束或取消手勢(shì)時(shí)不會(huì)調(diào)用更新回調(diào)。這時(shí),手勢(shì)狀態(tài)屬性會(huì)自動(dòng)將其狀態(tài)重置為初始值。
例如,若要?jiǎng)?chuàng)建一個(gè)在用戶執(zhí)行長(zhǎng)按時(shí)改變顏色的視圖,請(qǐng)?zhí)砑右粋€(gè)手勢(shì)狀態(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) } }
在某個(gè)手勢(shì)期間更新永久狀態(tài)
若要跟蹤手勢(shì)的變化且在手勢(shì)結(jié)束后不應(yīng)重置,請(qǐng)使用 onChanged(_:) (英文) 回調(diào)。例如,若要對(duì)你的 App 識(shí)別長(zhǎng)按的次數(shù)進(jìn)行計(jì)數(shù),請(qǐng)?zhí)砑右粋€(gè) onChanged(_:) (英文) 回調(diào)并遞增計(jì)數(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) } } }
在手勢(shì)結(jié)束時(shí)更新永久狀態(tài)
若要識(shí)別手勢(shì)在何時(shí)成功完成并檢索手勢(shì)的最終值,請(qǐng)?jiān)诨卣{(diào)中使用 onEnded(_:) (英文) 函數(shù)來更新你的 App 的狀態(tài)。SwiftUI 僅在手勢(shì)成功時(shí)才會(huì)調(diào)用 onEnded(_:) (英文) 回調(diào)。例如,在一個(gè) LongPressGesture (英文) 期間,如果用戶在經(jīng)過 minimumDuration (英文) 秒之前停止觸控視圖,或者他們的手指移動(dòng)超過了 maximumDistance (英文) 點(diǎn),則 SwiftUI 不會(huì)調(diào)用 onEnded(_:) (英文) 回調(diào)。
例如,若要在用戶完成長(zhǎng)按后停止長(zhǎng)按嘗試計(jì)數(shù),請(qǐng)?zhí)砑右粋€(gè) onEnded(_:) (英文) 回調(diào)并有條件地應(yīng)用手勢(shì)修飾符。
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) } } }
當(dāng)前題目:創(chuàng)新互聯(lián)IOS教程:添加手勢(shì)互動(dòng)操作
分享網(wǎng)址:http://www.dlmjj.cn/article/djggopp.html


咨詢
建站咨詢
