Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在SwiftUI中手势开始在帧外工作?_Swiftui - Fatal编程技术网

为什么在SwiftUI中手势开始在帧外工作?

为什么在SwiftUI中手势开始在帧外工作?,swiftui,Swiftui,我有一个Rec,我可以在手势动作中移动它,但问题是手势开始在它的帧外捕捉手势,我希望它只在帧内工作。以下是有关问题的代码和gif: gif: 代码: 据我所知,每次我使用GeometryReader时,我的容器的大小都会变得一团糟,从你发布这个问题的第一分钟起,我就试图找到一个解决方案,因为它非常有趣,下面是如何克服这个问题: GeometryReader { geometry in Rectangle() .fill(Color.red) .

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

gif:

代码:


据我所知,每次我使用
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
设置为
Overlay

注意:不要忘记将
覆盖
形状
不透明度
设置为0.001,这样它将不可见,但仍然是交互式的

瞧!一切似乎都很完美


我认为.position()覆盖了所有可用的容器空间。因为.signature()是附加的(在.position()之后),所以这就是最终接收事件的原因。也许你可以尝试在.position()之前移动.position(),看看会发生什么?@Cod3rMax:谢谢你的回答,但我不能接受,你不是在解决问题,你是在处理问题@威利:非常感谢:)如果你找到了解决方案或类似的东西,请告诉我,我很高兴知道,如果没有人如你所料回答,我将开始悬赏,也许会有更简单的解决方案。@Cod3rMax:当然,为了给你们提供信息,我可以通过读取水龙头X的位置或者做你们在Rec背景下做的同样的事情来更好地处理这个问题,我不是来处理这个问题的,而是来找出它发生的原因。问题是我们正在使用DragGesture()闭包器(“我的意思是苹果让我们使用它”),我不知道DragGesture()的母函数是什么,它给了我们价值、状态和翻译。@willy我已经向苹果工程师提交了一份支持请求,以解释确切的原因,第二件事,你应该在你的问题中公布你试图克服的问题,并在你的问题中而不是在你的标题中确切地问(为什么)。当我收到他们的回复时,我会更新我的答案@Cod3rMax:谢谢,我知道如何克服这个问题,并用一个简短的代码来处理它,但正如我所说的,我确实希望从basic解决这个问题,而不是使用其他代码来解决这个根本不应该存在的问题。我的想法是:苹果有另一个框架,而不是我们可以访问的框架,而这个框架制造了问题。像这样,你制作了一个API,你只能访问源代码和这个未知的框架。
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)
}