Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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
Ios 当它在移动视图内部时,会出现奇怪的滚动视图行为。迅捷_Ios_Xcode_Swiftui_Scrollview - Fatal编程技术网

Ios 当它在移动视图内部时,会出现奇怪的滚动视图行为。迅捷

Ios 当它在移动视图内部时,会出现奇怪的滚动视图行为。迅捷,ios,xcode,swiftui,scrollview,Ios,Xcode,Swiftui,Scrollview,我有一个容器视图,可以拖拽,里面有滚动视图和一堆按钮。当我拖动容器视图时,滚动视图开始奇怪地上下跳跃,按钮的点击框也开始远离实际按钮。(你可以看到我的gif) 但当我触摸scrollview时,一切都恢复正常。 此代码纯粹用于测试 这是主要观点 struct ContentView: View { @State var width : CGFloat = 300 @State var height : CGFloat = 300 var body: some V

我有一个容器视图,可以拖拽,里面有滚动视图和一堆按钮。当我拖动容器视图时,滚动视图开始奇怪地上下跳跃,按钮的点击框也开始远离实际按钮。(你可以看到我的gif) 但当我触摸scrollview时,一切都恢复正常。

此代码纯粹用于测试

这是主要观点

    struct ContentView: View {
    @State var width : CGFloat = 300
    @State var height : CGFloat = 300
    var body: some View {
        VStack{
            SecondView(width: width, height: height){
                ScrollView{
                    VStack{
                        ForEach(0...10, id : \.self){ i in
                            
                            TestButton(number: i)
                            
                        }
                    }
                }
            }
            Slider(value: $width, in: 100...500)
            Slider(value: $height, in: 100...500)
        }
    }
}
这是可拖动的视图

    struct SecondView<Content : View> : View {
    var width : CGFloat
    var height : CGFloat
    var content : () -> Content
    @GestureState private var dragState = DragState.inactive
    @State var position : CGSize = CGSize(width: 0, height: 0)
    var body : some View {
        let dragGesture = DragGesture().updating($dragState){ drag, state, transition in
            state = .dragging(translation: drag.translation)
            
        }.onEnded({drag in
            self.position.height+=drag.translation.height
            self.position.width+=drag.translation.width
        })
        return VStack{
            Handle()
            
            content().padding()
            
        }.frame(width: width, height: height).background(Color.yellow).cornerRadius(10)
            .offset(x: self.position.width + dragState.translation.width, y: self.position.height + dragState.translation.height)
            .gesture(dragGesture)
        
    }
    
    enum DragState {
        case inactive
        case dragging(translation : CGSize)
        
        
        var translation : CGSize {
            switch self {
            case .inactive:
                return .zero
            case .dragging(let translation):
                return translation
            }
        }
        
        var isDragging : Bool {
            switch self {
            case .inactive:
                return false
            case .dragging:
                return true
            }
        }
    }
}
struct SecondView:View{
变量宽度:CGFloat
变量高度:CGFloat
变量内容:()->内容
@GestureState私有变量dragState=dragState.inactive
@状态变量位置:CGSize=CGSize(宽度:0,高度:0)
var body:一些观点{
让dragGesture=dragGesture()
状态=.draging(转换:drag.translation)
}.onEnded({拖入
self.position.height+=drag.translation.height
self.position.width+=drag.translation.width
})
返回VStack{
句柄()
content().padding()
}.框架(宽度:宽度,高度:高度).背景(颜色.黄色).拐角半径(10)
.offset(x:self.position.width+dragState.translation.width,y:self.position.height+dragState.translation.height)
.手势(德拉格斯特尔)
}
枚举拖动状态{
案例无效
大小写拖动(翻译:CGSize)
var转换:CGSize{
切换自身{
案例.非活动:
返回,零
案例。拖动(让翻译):
返回翻译
}
}
var IsDraging:布尔{
切换自身{
案例.非活动:
返回错误
案例。拖动:
返回真值
}
}
}
}
我不确定这是个bug还是我做错了什么,但看起来像个bug
提前感谢您的回答和建议

偏移量修改器不会更改视图布局,因此移动的视图实际上保留在同一位置,命中区域保留在同一位置,它只是在不同的位置绘制

因此,
.offset
不适合您的目标,而是重构以使用
.position
,这确实会改变视图层次结构(但也会影响整个布局,因此您的浮动窗格应放置在单独的
ZStack
中,以避免其他窗格)