【问题标题】:Why gesture start working outside of frame in SwiftUI?为什么手势在 SwiftUI 中开始在框架外工作?
【发布时间】:2021-03-27 05:36:47
【问题描述】:

我有一个 Rec 可以在手势动作中移动它,但问题是手势开始在其框架外捕获手势,我希望它只在框架内工作。这是关于问题的代码和 gif:

gif:

代码:

    struct ContentView: View {
    
    @State private var recLocation: CGFloat = CGFloat()
    @GestureState private var recTranslation: CGFloat = CGFloat()
    
    var body: some View {
        
        GeometryReader { geometry in
            
            Rectangle().fill(Color.red).frame(width: 50, height: 50, alignment: .center)
                .position(x: recLocation + recTranslation + 25, y: geometry.size.height/2)
                .gesture( DragGesture()
                            .updating($recTranslation) { value, state, translation in
                                state = value.translation.width
                            }
                            .onEnded { value in
                                recLocation = recLocation + value.translation.width
                            } )
            
            
        }
        
    }
}

【问题讨论】:

  • 我认为 .position() 涵盖了所有可用的容器空间。因为 .gesture() 附加(在之后).position(),这就是最终接收事件的原因。也许您可以尝试将 .gesture() 移到 .position() 之前,看看会发生什么?

标签: swiftui


【解决方案1】:

据我所知,每次我使用GeometryReader 时,我的容器的大小都会被弄乱,自从你发布这个问题的第一分钟起,我就试图找到一个解决方案,因为它非常有趣,这里是如何克服这个问题问题:

GeometryReader { geometry in
    
    Rectangle()
        .fill(Color.red)
        .frame(width: 50, height: 50)
        .position(x: recLocation + recTranslation + 25, y: geometry.size.height/2)
        .overlay(
            Rectangle()
                .fill(Color.blue)
                .frame(width: 23.5, height: 23.5)
                .position(x: recLocation + recTranslation + 25, y: geometry.size.height/2)
                .opacity(0.001)
                .gesture( DragGesture()
                            .updating($recTranslation) { value, state, translation in
                                state = value.translation.width
                            }
                            .onEnded { value in
                                recLocation = recLocation + value.translation.width
                            } )
        )
    
}.frame(width: 50, height: 50)
}

说明:

基本上我看到的是DragGesture 在矩形边界之外被检测到,我创建了一个形状相同但尺寸更小的Overlay,并将DragGesture 设置为@987654328 @。

注意:不要忘记将 Overlay 形状 Opacity 设置为 0.001,这样它将不可见但仍可交互。

瞧!一切看起来都很完美。

【讨论】:

  • @Cod3rMax:谢谢你的回答,但我不能接受,你没有解决问题,你正在处理问题!
  • @willy 非常感谢您:) 如果您找到解决方案或类似的方法,请告诉我,如果没有人像您期望的那样回答,我会很高兴知道这一点,我会开始赏金也许会有更简单的解决方案。
  • @ Cod3rMax:当然,为了您的信息,我可以更好地处理读取水龙头 X 的位置或在 Rec 的背景下做同样的事情的问题,我不是来处理问题,而是发现出为什么会发生。问题是我们正在使用 DragGesture() 关闭器(“我的意思是 Apple 让我们使用它”),我不知道 DragGesture() 的母函数是什么,它给了我们价值、状态和翻译。
  • @willy 我已经向苹果工程师提交了一份支持请求,以解释确切原因,第二件事你应该在你的问题中发布你试图克服问题的内容,并在你的问题中准确地问 (WHY) 不是在你的标题中。当我收到他们的回复时,我会更新我的答案
  • @ Cod3rMax:谢谢,我知道如何才能轻松解决问题并在一个短行代码中处理它,但正如我所说,我确实希望从基本不使用其他代码解决问题用于解决根本不应该存在的问题。对于我的想法,是这样的:Apple 有另一个框架,而不是我们可以访问的框架,而那个框架会产生问题。像这样,你创建了一个 API,你只能访问源代码和这个未知的框架。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
相关资源
最近更新 更多