SwiftUI:使用自定义滑块时,什么是防止视图消失的正确逻辑语句

SwiftUI:使用自定义滑块时,什么是防止视图消失的正确逻辑语句,swiftui,Swiftui,当我使用定制的滑块时,我的SwiftUI视图正在消失。我认为这是因为观点的框架价值正在变得消极;然而,我觉得我已经正确地编码了逻辑,以防止这种情况发生(但有些事情是错误的) 我尝试了几种不同的if语句来防止值变为负值,但我没有运气 import SwiftUI struct ContentView: View { @State var scale: CGFloat = 1.0 @State private var dragged = CGSize.zero @State private va

当我使用定制的滑块时,我的SwiftUI视图正在消失。我认为这是因为观点的框架价值正在变得消极;然而,我觉得我已经正确地编码了逻辑,以防止这种情况发生(但有些事情是错误的)

我尝试了几种不同的if语句来防止值变为负值,但我没有运气

import SwiftUI

struct ContentView: View {

@State var scale: CGFloat = 1.0
@State private var dragged = CGSize.zero
@State private var accumulated = CGSize.zero

var body: some View {
    ZStack {
        Rectangle()
            .stroke()
            .frame(width: 300, height: 5, alignment: .leading)
            .position(x: 180, y: 30)
        Rectangle()
            .frame(width: 0 + dragged.width, height: 5, alignment: .leading)
            .position(x: 30 + (0.5 * dragged.width), y: 30)
        Circle()
            .foregroundColor(.red)
            .frame(width: 20, height: 20).border(Color.red)
            .position(x: 30, y: 30)
            .offset(x: self.dragged.width)
            .gesture(DragGesture()
                .onChanged{ value in

//My IF-Statement
                    if value.translation.width > 0 {
                        self.dragged = CGSize(
                            width: value.translation.width + self.accumulated.width,
                            height: value.translation.height + self.accumulated.height
                        )
                    }
            }
            .onEnded{ value in
                self.dragged = CGSize(
                    width: value.translation.width + self.accumulated.width,
                    height: value.translation.height + self.accumulated.height)
                self.accumulated = self.dragged
                }
        )
        VStack{
            Text("\(dragged.width)")
            Text("\(30 + (0.5 * dragged.width))")
        }
    }
  }
}
当我快速向左滑动红色圆圈太远时,会发生错误。我希望IF语句在使变量为负之前停止循环(如果我关于使它消失的原因的假设是正确的)。

向右限制 您不需要if语句,而是需要宽度可以达到的最大值。一种方法是使用
min(maxValue,计算)
强制宽度不超过
maxValue

限制在左边 拖动从红点开始,但拖动不限于绘制的比例,而是可以向左拖动,因为屏幕将一直持续到屏幕边缘,这会使向左的拖动变为负数

为了避免它,您可以检查结果是否为负值,如果是,只需使用0而不是负值,如下所示

import SwiftUI

struct SliderView: View {

    @State var scale: CGFloat = 1.0
    @State private var dragged = CGSize.zero
    @State private var accumulated = CGSize.zero

    let maxWidth: CGFloat = 300

    var body: some View {
        ZStack {
            Rectangle()
                .stroke()
                .frame(width: maxWidth, height: 5, alignment: .leading)
                .position(x: 180, y: 30)
            Rectangle()
                .frame(width: 0 + dragged.width, height: 5, alignment: .leading)
                .position(x: 30 + (0.5 * dragged.width), y: 30)
            Circle()
                .foregroundColor(.red)
                .frame(width: 20, height: 20).border(Color.red)
                .position(x: 30, y: 30)
                .offset(x: self.dragged.width)
                .gesture(DragGesture()
                    .onChanged{ value in
                        print("on changed called. width: \(value.translation.width)")

                        self.dragged = CGSize(
                            width: value.translation.width + self.accumulated.width > 0 ?
                                min(self.maxWidth, value.translation.width + self.accumulated.width) : 0,
                            height: value.translation.height + self.accumulated.height
                        )
                }
                .onEnded{ value in
                    self.dragged = CGSize(
                        width: value.translation.width + self.accumulated.width > 0 ?
                            min(self.maxWidth, value.translation.width + self.accumulated.width) : 0,
                        height: value.translation.height + self.accumulated.height)
                    self.accumulated = self.dragged
                    }
            )
            VStack{
                Text("\(dragged.width)")
                Text("\(30 + (0.5 * dragged.width))")
            }
        }
    }
}