CFSDN nhấn mạnh vào việc tạo ra giá trị thông qua mã nguồn mở. Chúng tôi cam kết xây dựng một nền tảng chia sẻ tài nguyên để mọi người làm CNTT có thể tìm thấy thế giới tuyệt vời của riêng mình tại đây.
Bài đăng trên blog CFSDN này khám phá các cử chỉ cơ bản của SwiftUI, được tác giả thu thập và biên soạn. Nếu bạn quan tâm đến bài viết này, hãy nhớ thích nó.

Lời nói đầu
.
Trong SwiftUI, chúng ta có thể làm cho ứng dụng của mình tương tác hơn bằng cách thêm các tương tác khác nhau để phản hồi các thao tác chạm, nhấp và vuốt của chúng ta.
Hôm nay, chúng ta sẽ xem xét các cử chỉ cơ bản của SwiftUI:
- ChạmGesture
- Cử chỉ nhấn lâu
- Cử chỉ kéo
- Cử chỉ phóng đại
- Cử chỉ xoay
ChạmGesture
.
Cử chỉ chạm cho phép chúng ta nhận ra một hoặc nhiều lần chạm trên một Chế độ xem. Chúng tôi có nhiều cách để thêm cử chỉ chạm.
Đầu tiên là sử dụng trực tiếp trình sửa đổi .onTapGesture.
- Vòng tròn()
- .onTapGesture {
- // Trả lời ĐẾN Chạm vào cử chỉ
- }
Tùy chọn khác được sử dụng trong tài liệu SwiftUI là tạo cử chỉ và cấu hình nó như một thuộc tính, sau đó sử dụng nó với trình sửa đổi .gesture(_:include:).
Lưu ý: Để thực hiện một hành động hoặc phản hồi thao tác chạm, chúng ta cần đóng bằng hành động .onEnded, hành động này sẽ được kích hoạt khi cử chỉ kết thúc.
- cấu trúc SingleTapGestureView: Xem {
- biến singleTap: một số Cử chỉ {
- ChạmGesture()
- . đã kết thúc { _ TRONG
- // Trả lời ĐẾN Chạm vào cử chỉ
- }
- }
-
- thân biến: một số Xem {
- Vòng tròn()
- .cử chỉ(một lần chạm)
- }
- }
Trên thực tế, tôi thích cách tiếp cận thứ hai hơn vì theo cách này, chúng ta có thể tạo ra nhiều cử chỉ khác nhau và sử dụng lại chúng thông qua mã của mình.
Vì vậy, nếu chúng ta ghép mã lại với nhau, chúng ta có thể bắt đầu viết một cái gì đó như thế này.
- cấu trúc TapGestureView: Xem {
- @State private var isAnimating = SAI
- @State private var tapped1x = 0
-
- biến singleTap: một số Cử chỉ {
- ChạmGesture()
- . đã kết thúc { _ TRONG
- đã khai thác1x += 1
-
- withAnimation(Animation.easeOut(thời lượng: 0,5)) {
- self.isAnimating = ĐÚNG VẬY
- }
-
- DispatchQueue.main.asyncAfter(hạn chót: .now() + 0,5) {
- self.isAnimating = SAI
- }
- }
- }
-
- thân biến: một số Xem {
- VStack {
- Chữ("Đã nhấn 1X: \(đã nhấn 1x) lần")
- .font(.caption)
-
- Vòng tròn()
- .frame(chiều rộng: 80, chiều cao: 80)
- .foregroundColor(.cam)
- . lớp phủ(
- Chữ("1X")
- .fontWeight(.trung bình)
- )
- .lý lịch(
- Vòng tròn()
- .strokeBorder(Màu.xanh lam, chiều rộng dòng: 3)
- .scaleEffect(làHoạthình? 1.5 : 1)
- .opacity(làHoạt ảnh? 0 : 1)
- )
- .cử chỉ(một lần chạm)
- }
- }
- }
Tương tự như vậy, chúng ta có thể kiểm soát số lần chạm để phản hồi chỉ bằng cách sử dụng trình khởi tạo TapGesture(count: Int).
Trong trường hợp này, bạn cần nhấp 3 lần để kích hoạt hành động .onEnded để đóng.
- cấu trúc TapGesture3xView: Xem {
- @State private var isAnimating = SAI
- @State private var tapped3x = 0
-
- var multipleTap: một số Cử chỉ {
- ChạmGestuređếm: 3)
- . đã kết thúc { _ TRONG
- đã khai thác 3x += 1
-
- withAnimation(Animation.easeOut(thời lượng: 0,5)) {
- self.isAnimating = ĐÚNG VẬY
- }
-
- DispatchQueue.main.asyncAfter(hạn chót: .now() + 0,5) {
- self.isAnimating = SAI
- }
- }
- }
-
- thân biến: một số Xem {
- VStack {
- Chữ("Đã nhấn 3 lần: \(đã nhấn 3 lần)")
- .font(.caption)
-
- Vòng tròn()
- .frame(chiều rộng: 80, chiều cao: 80)
- .foregroundColor(.cam)
- . lớp phủ(
- Chữ("3X")
- .fontWeight(.trung bình)
- )
- .lý lịch(
- Vòng tròn()
- .strokeBorder(Màu.xanh lam, chiều rộng dòng: 3)
- .scaleEffect(làHoạthình? 1.5 : 1)
- .opacity(làHoạt ảnh? 0 : 1)
- )
- .cử chỉ(nhiều lần chạm)
- }
- }
- }
Cử chỉ nhấn lâu
.
Cử chỉ nhấn lâu cho phép chúng ta thực hiện một hành động sau khi người dùng nhấn lâu trong một khoảng thời gian xác định và trong suốt thời gian người dùng nhấn lâu.
Chúng ta có thể thiết lập thời lượng tối thiểu để cử chỉ nhấn và giữ của mình được nhận dạng. Bạn có thể thiết lập tính năng này trong trình khởi tạo LongPressGesture.
- LongPressGesture(thời gian tối thiểu: 2)
Sau đó, chúng ta có thể sử dụng phương thức .updating để thực hiện các hành động khi nhấn và giữ, và .onEnded để thực hiện các hành động khi cử chỉ của chúng ta được nhận dạng.
Trong ví dụ này, tôi sẽ cập nhật kích thước và màu sắc của Circle() trong khi nhấn và giữ thao tác, và khi cử chỉ được nhận dạng, tôi sẽ hiển thị "Văn bản đã hoàn tất".
Ngoài ra, tôi đang sử dụng trình bao bọc thuộc tính GestureState được đặt thành true khi nhấn và giữ và thành false khi cử chỉ kết thúc. Tôi đang sử dụng trình bao bọc thuộc tính này cho một hình ảnh động mẫu.
- cấu trúc LongPressGestureView: Xem {
- @GestureState biến riêng tư isLongPressDetected = SAI
- @State private var isDone = SAI
-
- var longPress: một số Cử chỉ {
- LongPressGesture(thời gian tối thiểu: 2)
- .updating($isLongPressDetected) { trạng thái hiện tại, trạng thái cử chỉ, giao dịch TRONG
- DispatchQueue.main.async {
- đã xong = SAI
- }
- gestureState = trạng thái hiện tại
- giao dịch.animation = Animation.easeIn(thời lượng: 2)
- }
- .onEnded { xong TRONG
- isDone = đã xong
- }
- }
-
- thân biến: một số Xem {
- VStack {
- Khoảng cách()
-
- Vòng tròn()
- .frame(chiều rộng: 10, chiều cao: 10)
- .foregroundColor(isLongPressDetected ? .orange : .sơ đẳng)
- .scaleEffect(Kích thước CGS(
- chiều rộng: isLongPressDetected ? 10 : 1,
- chiều cao: isLongPressDetected ? 10 : 1))
-
- Khoảng cách()
- nếu isLongPressDetected {
- Chữ("Đang cập nhật...")
- }
-
- nếu isDone {
- Chữ("Xong")
- }
-
- Khoảng cách()
-
- Chữ("Nhấn và giữ 2 giây")
- .đệm()
- .background(isLongPressDetected ? Color.green : Color.orange)
- .Bán kính góc(16)
- .cử chỉ(nhấn lâu)
- }
- }
- }
Cử chỉ kéo
.
Cử chỉ kéo cho phép chúng ta thực hiện các hành động trong khi kéo chế độ xem.
Chúng ta có thể tận dụng và sử dụng các phương thức tắt .onChanged và .onEnded để thực hiện một số hành động. Cả hai phương pháp đều cung cấp cho chúng ta thuộc tính tuyệt vời DragGesture.Value, lưu trữ thông tin cử chỉ kéo sau:
vị trí .
dự đoánEndLocation .
dự đoánEndTranslation .
bắt đầuVị trí .
thời gian .
bản dịch.
Chúng ta có thể sử dụng thuộc tính này để tạo chế độ xem có thể di chuyển. Trong ví dụ hiện tại, tôi sử dụng phương thức .onChanged để cập nhật tọa độ vị trí Circle().
- cấu trúc DragGestureView: Xem {
- @State private var location: CGPoint = CGPoint(x: 100, y: 100)
-
- kéo var: một số Cử chỉ {
- DragGesture(khoảng cách tối thiểu: 1, tọa độKhông gian: .địa phương)
- .onChanged { giá trị TRONG
- vị trí = giá trị.vị trí
- }
- }
-
- thân biến: một số Xem {
- Vòng tròn()
- .frame(chiều rộng: 100, chiều cao: 100)
- .foregroundColor(.cam)
- .vị trí(vị trí)
- .cử chỉ(kéo)
- }
- }
Tại đây, phương thức .onEnded được thêm vào để thiết lập lại tọa độ vị trí Circle() sau khi quá trình kéo kết thúc.
- cấu trúc DragGestureView: Xem {
- @State private var location: CGPoint = CGPoint(x: 100, y: 100)
-
- kéo var: một số Cử chỉ {
- DragGesture(khoảng cách tối thiểu: 1, tọa độKhông gian: .địa phương)
- .onChanged { giá trị TRONG
- vị trí = giá trị.vị trí
- }
- .onEnded { giá trị TRONG
- vớiAnimation(.easeOut) {
- vị trí = CGPoint(x: 100, y: 100)
- }
- }
- }
-
- thân biến: một số Xem {
- Vòng tròn()
- .frame(chiều rộng: 100, chiều cao: 100)
- .foregroundColor(.cam)
- .vị trí(vị trí)
- .cử chỉ(kéo)
- }
- }
Cử chỉ phóng đại
.
Khi chúng ta áp dụng thao tác phóng đại trên Chế độ xem, cử chỉ phóng đại cho phép thực hiện một số thao tác.
Ở đây, chúng ta cũng có các closure .onChanged và .onEnded mà chúng ta có thể sử dụng để phản hồi trong hoặc khi kết thúc hành động thu phóng. Với tư cách là một thuộc tính, nó nhận được MagnificationGesture.Value của CGFloat. Chúng ta có thể sử dụng ví dụ này để thay đổi kích thước chế độ xem.
- cấu trúc MagnificationGestureView: Xem {
- @State var magnifiedValue: CGFloat = 1.0
-
- độ phóng đại var: một số Cử chỉ {
- Phóng đạiGesture()
- .onChanged { giá trị TRONG
- magnifiedValue = giá trị
- }
- .onEnded { giá trị TRONG
- Giá trị phóng đại = 1.0
- }
- }
-
- thân biến: một số Xem {
- Vòng tròn()
- .frame(chiều rộng: 100 * magnifiedValue, chiều cao: 100 * magnifiedValue)
- .foregroundColor(.cam)
- .cử chỉ(phóng to)
- .hoạt hình(.easeOut)
- }
- }
Cử chỉ xoay
.
Cử chỉ xoay cho phép xoay chế độ xem và phản hồi bằng một số hành động trong và khi kết thúc quá trình xoay.
Nó cũng cung cấp cho chúng ta các closure .onChanged và .onEnded, cung cấp cho chúng ta RotationGesture.Value, biểu diễn giá trị Góc cử chỉ. Chúng ta có thể sử dụng giá trị này để xoay chế độ xem.
- cấu trúc RotationGestureView: Xem {
- @State private var angle = Góc (độ: 0,0)
- @State private var backgroundAngle = Góc (độ: 0.0)
-
- phép quay var: một số Cử chỉ {
- Cử chỉ xoay()
- .onChanged { góc TRONG
- self.angle = góc
- }
- .onEnded { góc TRONG
- vớiAnimation(Animation.spring()) {
- self.backgroundAngle = góc
- }
- }
- }
-
- thân biến: một số Xem {
- Hình chữ nhật()
- .frame(chiều rộng: 150, chiều cao: 150, căn chỉnh: .center)
- .foregroundColor(.cam)
- .rotationEffect(góc của chính nó)
- .cử chỉ(xoay)
- .lý lịch(
- Hình chữ nhật()
- .shadow(màu sắc: .sơ đẳng, bán kính: 10, x: 0,0, y: 0,01)
- .foregroundColor(.secondary)
- .rotationEffect(góc nền)
- )
- }
- }
Tóm tắt
.
Trên đây là tóm tắt những cử chỉ cơ bản của SwiftUI. Chúng ta có thể triển khai nhiều tương tác hơn để làm cho ứng dụng của mình sinh động hơn.
Đối với mục đích sử dụng nâng cao, bạn có thể kết hợp hoặc sử dụng cử chỉ đồng thời để phản hồi hoặc có thể triển khai cử chỉ tùy chỉnh của riêng mình.
Liên kết gốc: https://mp.weixin.qq.com/s/r53xNP6GRWRV9cU97LIEKA.
Cuối cùng, bài viết này về khám phá cử chỉ cơ bản của SwiftUI đã có ở đây. Nếu bạn muốn biết thêm về khám phá cử chỉ cơ bản của SwiftUI, vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!