Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others


0 votes
in Technique[技术] by (71.8m points)

ios - Question about .gesture(drag gesture) in swift ui

I am trying to detect when this text view has been swiped on. The code compiles fine, but I am not able to trigger the swipe on my actual device. When I swipe, nothing happens. Tap seems to work just fine. Can anyone let me know what I'm doing wrong in my code?

In case this matters, I'm developing a watch OS app in swift 5.3 with the latest Xcode.

var body: some View {

    Text(tempstring).onTapGesture { checkStateRoll() }
    .frame(maxWidth: .infinity, maxHeight: .infinity)
    .gesture(DragGesture(minimumDistance: 10, coordinateSpace: .global)
     .onEnded { value in
                            let horizontalAmount = value.translation.width as CGFloat
                            let verticalAmount = value.translation.height as CGFloat
                            if abs(horizontalAmount) > abs(verticalAmount) {
                                horizontalAmount < 0 ? leftswipe() : rightswipe()
                            } else {
                                verticalAmount < 0 ? upswipe() : downswipe()
                            tempstring = String(numdice) + "d" + String(typesofdice[typedice])
                        }        ) 
    .background(progstate == 2 ? Color.blue : Color.red)

Thanks a lot for any help. This has been stumping me for weeks.

Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

A couple of things:

  1. With respect to layout, setting a frame will no change the text size because the text sizes itself to its content. Use a greedy view like a ZStack if you want to take up all of the space.
  2. The sequence of the modifiers does matter. You read the order in which they are applied from bottom to top, so in this case they need to go on the stack.

Here is an example playground:

import SwiftUI
import PlaygroundSupport

struct V: View {
  var body: some View {
    ZStack {
      .onTapGesture { print("tap") }
      .gesture(DragGesture(minimumDistance: 10, coordinateSpace: .global).onEnded { print($0)})


let host = UIHostingController(rootView: V().frame(width: 500.0, height: 500.0))
host.preferredContentSize = CGSize(width: 300, height: 300)
PlaygroundPage.current.liveView = host

Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share