- vừa được xem lúc

[SwiftUI] Drag Gesture

0 0 17

Người đăng: Tran Huu Tan

Theo Viblo Asia

A dragging motion that invokes an action as the drag-event sequence changes.

Apple Documentation

Trong hướng dẫn này, chúng ta sẽ tìm hiểu Drag Gesture trong SwiftUI là gì:

  • .onChanged.
  • .updating.
  • .onEnded.
  • limit scrolling.

Điều kiện tiên quyết

Để làm theo hướng dẫn này, bạn sẽ cần một số kiến thức cơ bản về:

  • Cơ bản với Swift.
  • Xcode 11 trở lên

.onChanged

onChanged thay đổi giá trị của vị trí khi bạn kéo.

Đầu tiên, tạo một biến để lưu kích thước. Với biến bên dưới, đối tượng được đặt ở tọa độ với x, y là 50

@State private var rectPosition = CGPoint(x: 50, y: 50)

Khi hình chữ nhật di chuyển, bạn sẽ thay đổi rectPosition

VStack { RoundedRectangle(cornerRadius: 4.0) .fill(Color.green) .frame(width: 100, height: 100) .position(rectPosition) .gesture(DragGesture().onChanged({ value in self.rectPosition = value.location }))
}

Kết quả là bạn có một hình chữ nhật chuyển động như dưới.

.updating

Bạn có thể biết người dùng có đang kéo hay không bằng cách lấy state. Đầu tiên, tạo GestureState để giữ trạng thái drag.

@GestureState private var isDragging = false

Tại đây, bạn không thể cập nhật isDragging vì nó ở chế độ chỉ đọc. Tuy nhiên, bạn có thể cập nhật state sau đó nó sẽ cập nhật isDragging.

.gesture(DragGesture().onChanged({ value in self.rectPosition = value.location
}).updating($isDragging, body: { (value, state, trans) in state = true
}))

.onEnded

Nhiều trường hợp bạn chỉ muốn lấy hành động sau khi người dùng kéo xong đối tượng. Đầu tiên, tạo một biến để biết người dùng kết thúc kéo hay chưa.

@State private var isEnded = false

Sử dụng cùng mã như trên và chỉnh sửa một chút, cho màu thay đổi nếu x nhỏ hơn 120.

VStack { RoundedRectangle(cornerRadius: 4.0) .fill(isEnded ? Color.red : Color.green) .frame(width: 100, height: 100) .position(rectPosition) .gesture(DragGesture().onChanged({ value in self.rectPosition = value.location }).onEnded({ value in self.isEnded = value.location.x < 120 }))
}

Kết quả:

Hạn chế cuộn ngang

.gesture(DragGesture().onChanged({ value in self.rectPosition = CGPoint(x: value.location.x, y: 50)
}))

Còn nếu bạn chỉ muốn nó cuộn theo chiều dọc, thì bạn chỉ việc thay đổi giá trị y.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 1: Làm quen cô nàng Flutter

Lời mở đầu. Gần đây, Flutter nổi lên và được Google PR như một xu thế của lập trình di động vậy.

0 0 254

- vừa được xem lúc

Học Flutter từ cơ bản đến nâng cao. Phần 3: Lột trần cô nàng Flutter, BuildContext là gì?

Lời mở đầu. Màn làm quen cô nàng FLutter ở Phần 1 đã gieo rắc vào đầu chúng ta quá nhiều điều bí ẩn về nàng Flutter.

0 0 189

- vừa được xem lúc

Swift: Tạo custom phép toán tử (Operator) của riêng bạn!

Swift cho phép bạn tạo các toán tử có thể tùy chỉnh của riêng bạn. Điều này đặc biệt hữu ích khi bạn xử lý các loại dữ liệu của riêng mình. Operator Types in Swift. Có năm loại toán tử chính trong Swift.

0 0 45

- vừa được xem lúc

Chương 6 Protocol oriented programming.

Cuốn sách này là về lập trình hướng protocol. Khi Apple thông báo swift 2 ở WWDC 2015.

0 0 28

- vừa được xem lúc

Ví dụ về UIActivityViewController

Trên iOS, UIActivityViewController cung cấp giao diện thống nhất để người dùng chia sẻ và thực hiện các hành động trên văn bản, hình ảnh, URL và các mục khác trong ứng dụng. let string = "Hello, world!". let url = URL(string: "https://nshipster.com").

0 0 45

- vừa được xem lúc

Quản lý self và cancellable trong Combine.

. . Công việc quản lý bộ nhớ memory management thường trở nên phức tạp khi chúng ta thực hiện các tác vụ bất đồng bộ asynchronous vì chúng ta thường phải lưu giữ một số object nằm ngoài scope mà object được define trong khi vẫn phải đảm bảo được việc giải phóng object đó được thực hiện đúng quy trìn

0 0 28