首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当它在移动视图中时,奇怪的ScrollView行为。SwiftUI

当它在移动视图中时,奇怪的ScrollView行为。SwiftUI
EN

Stack Overflow用户
提问于 2020-07-16 06:50:09
回答 1查看 216关注 0票数 2

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

这段代码纯粹是为了测试。

这是主要观点

代码语言:javascript
运行
复制
    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)
        }
    }
}

这就是可拖动的视图

代码语言:javascript
运行
复制
    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
            }
        }
    }
}

我不确定是错误还是我做错了什么,但看起来像是错误,提前感谢您的回答和建议

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-16 10:19:20

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62924879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档