成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

探索 SwiftUI 基本手勢

開發 前端
本篇是對 SwiftUI 基本手勢的總結。我們可以實現更多的交互使我們的 App 變得更生動。對于高級的使用,可以將手勢組合或者同時使用以做出響應,或者可以實現自己的自定義手勢。

[[400610]]

前言

在 SwiftUI 中,我們可以通過添加不同的交互來使我們的應用程序更具交互性,這些交互可以響應我們的點擊,點擊和滑動。

今天,我們將回顧SwiftUI基本手勢:

  • TapGesture
  • 長按手勢
  • 拖動手勢
  • 放大手勢
  • 旋轉手勢

TapGesture

輕擊手勢使我們能夠識別 View 上的一個或多個輕擊。我們有幾種方法可以添加點擊手勢。

第一個是直接使用 .onTapGesture 修飾符。

  1. Circle() 
  2.   .onTapGesture { 
  3.     // Respond to Tap Gesture  
  4.   } 

SwiftUI 文檔中使用的其他選項是通過創建手勢并將其配置為屬性,然后將其與 .gesture(_:include :) 修飾符一起使用。

注意: 為了執行某項操作或響應輕擊,我們需要使用 .onEnded 操作關閉,該操作在手勢結束時觸發。

  1. struct SingleTapGestureView: View { 
  2.   var singleTap: some Gesture { 
  3.       TapGesture() 
  4.           .onEnded { _ in 
  5.               // Respond to Tap Gesture 
  6.           } 
  7.   } 
  8.  
  9.   var body: some View { 
  10.       Circle() 
  11.           .gesture(singleTap) 
  12.   } 

實際上,我更喜歡第二種方法,因為這樣我們可以創建不同的手勢并通過我們的代碼重復使用它們。

因此,如果我們將代碼放在一起,就可以開始編寫類似的東西。

圖片
  1. struct TapGestureView: View { 
  2.     @State private var isAnimating = false 
  3.     @State private var tapped1x = 0 
  4.  
  5.     var singleTap: some Gesture { 
  6.         TapGesture() 
  7.             .onEnded { _ in 
  8.                 tapped1x += 1 
  9.  
  10.                 withAnimation(Animation.easeOut(duration: 0.5)) { 
  11.                     self.isAnimating = true 
  12.                 } 
  13.  
  14.                 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 
  15.                     self.isAnimating = false 
  16.                 } 
  17.             } 
  18.     } 
  19.  
  20.     var body: some View { 
  21.         VStack { 
  22.             Text("Tapped 1X: \(tapped1x) times"
  23.                 .font(.caption) 
  24.  
  25.             Circle() 
  26.                 .frame(width: 80, height: 80) 
  27.                 .foregroundColor(.orange) 
  28.                 .overlay( 
  29.                     Text("1X"
  30.                         .fontWeight(.medium) 
  31.                 ) 
  32.                 .background( 
  33.                     Circle() 
  34.                         .strokeBorder(Color.blue, lineWidth: 3) 
  35.                         .scaleEffect(isAnimating ? 1.5 : 1) 
  36.                         .opacity(isAnimating ? 0 : 1) 
  37.                 ) 
  38.                 .gesture(singleTap) 
  39.         } 
  40.     } 

類似地,我們只需使用 TapGesture(count:Int) 初始化程序就可以控制要響應的數量。

在這種情況下,您需要點擊3次才能觸發 .onEnded 操作關閉。

圖片
  1. struct TapGesture3xView: View { 
  2.     @State private var isAnimating = false 
  3.     @State private var tapped3x = 0 
  4.  
  5.     var multipleTap: some Gesture { 
  6.         TapGesture(count: 3) 
  7.             .onEnded { _ in 
  8.                 tapped3x += 1 
  9.  
  10.                 withAnimation(Animation.easeOut(duration: 0.5)) { 
  11.                     self.isAnimating = true 
  12.                 } 
  13.  
  14.                 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 
  15.                     self.isAnimating = false 
  16.                 } 
  17.             } 
  18.     } 
  19.  
  20.     var body: some View { 
  21.         VStack { 
  22.             Text("Tapped 3X: \(tapped3x) times"
  23.                 .font(.caption) 
  24.  
  25.             Circle() 
  26.                 .frame(width: 80, height: 80) 
  27.                 .foregroundColor(.orange) 
  28.                 .overlay( 
  29.                     Text("3X"
  30.                         .fontWeight(.medium) 
  31.                 ) 
  32.                 .background( 
  33.                     Circle() 
  34.                         .strokeBorder(Color.blue, lineWidth: 3) 
  35.                         .scaleEffect(isAnimating ? 1.5 : 1) 
  36.                         .opacity(isAnimating ? 0 : 1) 
  37.                 ) 
  38.                 .gesture(multipleTap) 
  39.         } 
  40.     } 

長按手勢

長按手勢可讓我們在用戶長按定義的時間后以及在用戶長按的時間內執行操作。

我們可以設置一個最小持續時間,以識別我們的長按手勢。可以在 LongPressGesture 初始化程序中進行設置。

  1. LongPressGesture(minimumDuration: 2) 

然后,我們可以使用 .updating 方法在長按期間執行操作,并使用 .onEnded 在識別到我們的手勢時執行操作。

在此示例中,我將在長按操作期間更新 Circle() 的大小和顏色,并且當識別出手勢時,我將顯示“文本已完成”。

另外,我在這里使用的是 GestureState 屬性包裝器,該包裝器在長按期間設置為 true ,在手勢結束時設置為 false 。我正在將此屬性包裝器用于示例動畫。

圖片
  1. struct LongPressGestureView: View { 
  2.     @GestureState private var isLongPressDetected = false 
  3.     @State private var isDone = false 
  4.  
  5.     var longPress: some Gesture { 
  6.         LongPressGesture(minimumDuration: 2) 
  7.             .updating($isLongPressDetected) { currentState, gestureState, transaction in 
  8.                 DispatchQueue.main.async { 
  9.                     isDone = false 
  10.                 } 
  11.                 gestureState = currentState 
  12.                 transaction.animation = Animation.easeIn(duration: 2) 
  13.             } 
  14.             .onEnded { done in 
  15.                 isDone = done 
  16.             } 
  17.     } 
  18.  
  19.     var body: some View { 
  20.         VStack { 
  21.             Spacer() 
  22.  
  23.             Circle() 
  24.                 .frame(width: 10, height: 10) 
  25.                 .foregroundColor(isLongPressDetected ? .orange : .primary
  26.                 .scaleEffect(CGSize( 
  27.                                 width: isLongPressDetected ? 10 : 1, 
  28.                                 height: isLongPressDetected ? 10 : 1)) 
  29.  
  30.             Spacer() 
  31.             if isLongPressDetected { 
  32.                 Text("Updating..."
  33.             } 
  34.  
  35.             if isDone { 
  36.                 Text("Done"
  37.             } 
  38.  
  39.             Spacer() 
  40.  
  41.             Text("Long Press 2 sec"
  42.                 .padding() 
  43.                 .background(isLongPressDetected ? Color.green : Color.orange) 
  44.                 .cornerRadius(16) 
  45.                 .gesture(longPress) 
  46.         } 
  47.     } 

 拖動手勢

拖動手勢允許我們在拖動視圖時執行操作。

我們可以利用并使用 .onChanged 和 .onEnded 關閉方法來執行某些操作。這兩種方法都為我們提供了出色的屬性 DragGesture.Value,該屬性存儲以下拖動動作信息:

location

predictedEndLocation

predictedEndTranslation

startLocation

time

translation

我們可以使用該屬性來創建可移動視圖。在當前示例中,我使用 .onChanged 方法更新 Circle() 位置坐標。

圖片
  1. struct DragGestureView: View { 
  2.     @State private var location: CGPoint = CGPoint(x: 100, y: 100) 
  3.  
  4.     var drag: some Gesture { 
  5.         DragGesture(minimumDistance: 1, coordinateSpace: .local
  6.             .onChanged { value in 
  7.                 location = value.location 
  8.             } 
  9.     } 
  10.  
  11.     var body: some View { 
  12.         Circle() 
  13.             .frame(width: 100, height: 100) 
  14.             .foregroundColor(.orange) 
  15.             .position(location) 
  16.             .gesture(drag) 
  17.     } 

在這里,添加了 .onEnded 方法,以在拖動結束后重置 Circle() 位置坐標。

圖片
  1. struct DragGestureView: View { 
  2.     @State private var location: CGPoint = CGPoint(x: 100, y: 100) 
  3.  
  4.     var drag: some Gesture { 
  5.         DragGesture(minimumDistance: 1, coordinateSpace: .local
  6.             .onChanged { value in 
  7.                 location = value.location 
  8.             } 
  9.             .onEnded { value in 
  10.                 withAnimation(.easeOut) { 
  11.                     location = CGPoint(x: 100, y: 100) 
  12.                 } 
  13.             } 
  14.     } 
  15.  
  16.     var body: some View { 
  17.         Circle() 
  18.             .frame(width: 100, height: 100) 
  19.             .foregroundColor(.orange) 
  20.             .position(location) 
  21.             .gesture(drag) 
  22.     } 

放大手勢

當我們在View上應用放大動作時,放大手勢允許做出一些動作。

在這里,還有 .onChanged 和 .onEnded 閉包,我們可以使用它們來在放大動作期間或結束時進行響應。作為屬性,接收到的是 CGFloat 的 MagnificationGesture.Value 。我們可以以此為例來更改視圖大小。

圖片
  1. struct MagnificationGestureView: View { 
  2.     @State var magnifiedValue: CGFloat = 1.0 
  3.  
  4.     var magnification: some Gesture { 
  5.         MagnificationGesture() 
  6.             .onChanged { value in 
  7.                 magnifiedValue = value 
  8.             } 
  9.             .onEnded { value in 
  10.                 magnifiedValue = 1.0 
  11.             } 
  12.     } 
  13.  
  14.     var body: some View { 
  15.         Circle() 
  16.             .frame(width: 100 * magnifiedValue, height: 100 * magnifiedValue) 
  17.             .foregroundColor(.orange) 
  18.             .gesture(magnification) 
  19.             .animation(.easeOut) 
  20.     } 

旋轉手勢

旋轉手勢允許旋轉視圖,并在旋轉過程中和旋轉結束時以某些動作做出響應。

它還為我們提供了 .onChanged 和 .onEnded 閉包,這些閉包為我們提供了 RotationGesture.Value,它表示手勢 Angle 值。我們可以使用該值旋轉視圖。

圖片
  1. struct RotationGestureView: View { 
  2.     @State private var angle = Angle(degrees: 0.0) 
  3.     @State private var backgroundAngle = Angle(degrees: 0.0) 
  4.  
  5.     var rotation: some Gesture { 
  6.         RotationGesture() 
  7.             .onChanged { angle in 
  8.                 self.angle = angle 
  9.             } 
  10.             .onEnded { angle in 
  11.                 withAnimation(Animation.spring()) { 
  12.                     self.backgroundAngle = angle 
  13.                 } 
  14.             } 
  15.     } 
  16.  
  17.     var body: some View { 
  18.         Rectangle() 
  19.             .frame(width: 150, height: 150, alignment: .center) 
  20.             .foregroundColor(.orange) 
  21.             .rotationEffect(self.angle) 
  22.             .gesture(rotation) 
  23.             .background( 
  24.                 Rectangle() 
  25.                     .shadow(color: .primary, radius: 10, x: 0.0, y: 0.01) 
  26.                     .foregroundColor(.secondary) 
  27.                     .rotationEffect(backgroundAngle) 
  28.             ) 
  29.     } 

總結

上面是對 SwiftUI 基本手勢的總結。我們可以實現更多的交互使我們的 App 變得更生動。

對于高級的使用,可以將手勢組合或者同時使用以做出響應,或者可以實現自己的自定義手勢。

 

責任編輯:姜華 來源: Swift 社區
相關推薦

2011-06-28 09:53:43

iPhone諾基亞N9

2015-07-22 10:34:59

手勢密碼源碼

2016-03-16 09:40:33

Windows 10觸控手勢微軟

2013-07-18 18:14:26

UITableViewiOS長按手勢UILongPress

2022-05-17 12:25:59

物聯網智能建筑樓宇自控

2022-06-20 09:01:50

SwiftUI狀態管理系統

2022-08-24 09:02:27

SwiftUIiOS

2022-03-09 09:00:41

SwiftUI視圖生成器Swift

2013-05-14 11:18:24

AIR AndroidSwipe手勢

2022-02-18 09:04:22

動畫SwiftUI工具:

2022-02-23 12:23:28

協議動畫SwiftUI

2022-03-01 09:01:56

SwiftUI動畫進階Canvas

2010-09-28 15:09:10

2013-12-08 22:02:24

手勢交互交互設計交互體驗

2023-12-29 09:01:10

SwiftUI空狀態Product?

2021-07-13 12:20:40

Core DataSwiftUIiOS

2022-01-19 09:00:51

UI前端手機開發

2024-05-17 09:00:45

SwiftUIvisionOS

2022-02-14 09:24:15

SwiftUI協議

2023-11-20 09:55:34

音頻圖表SwiftUI
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产日韩欧美一区 | 久久久久久亚洲精品不卡 | 九九热精品视频在线观看 | 国产精品亚洲视频 | 能看的av | 亚洲国产精品99久久久久久久久 | 毛色毛片免费看 | 亚洲视频三| 美女一级毛片 | 日本免费黄色一级片 | 亚洲久久一区 | 午夜一级做a爰片久久毛片 精品综合 | 欧美一区二区三区大片 | 九九热精品在线视频 | 在线日韩欧美 | 精品国产伦一区二区三区观看方式 | 国产精品精品 | 在线国产一区二区 | 亚洲综合色自拍一区 | 欧美日韩在线视频一区 | 一区二区免费在线 | 欧美日韩在线一区二区三区 | 欧美在线视频二区 | 久久精品国产一区二区电影 | 国产免费一区二区三区网站免费 | 国产精品大片 | 99久久婷婷国产精品综合 | www.色午夜.com | 日韩高清一区二区 | 日日骚网| 日本精品一区二区三区视频 | 成人亚洲 | 欧美日韩18 | 日本久久精品视频 | 超碰导航 | 国产精品色av | 国产精品免费一区二区三区四区 | 免费观看一级毛片 | 不卡av电影在线播放 | 中文字幕在线观看av | 国产成人福利在线观看 |