ios SWIFT模拟器黑屏

xxhby3vn  于 2023-05-23  发布在  iOS
关注(0)|答案(1)|浏览(226)
import SwiftUI

struct ContentView: View {
@State private var horizontalLines: [CGFloat] = [50, 100]
@State private var verticalLines: [CGFloat] = [100, 200]
@GestureState private var dragOffset: CGSize = CGSize.zero

var body: some View {
    GeometryReader { geometry in
        ZStack {
            Rectangle()
                .frame(width: geometry.size.width, height: geometry.size.height)
                .border(Color.black, width: 1)
            
            ForEach(horizontalLines, id: \.self) { y in
                LineView(startPoint: CGPoint(x: 0, y: y), endPoint: CGPoint(x: geometry.size.width, y: y))
                    .gesture(horizontalDragGesture(y: y))
            }
            
            ForEach(verticalLines, id: \.self) { x in
                LineView(startPoint: CGPoint(x: x, y: 0), endPoint: CGPoint(x: x, y: geometry.size.height))
                    .gesture(verticalDragGesture(x: x))
            }
        }
        .background(Color.white)
        .gesture(containerDragGesture(geometry: geometry))
    }
    .edgesIgnoringSafeArea(.all)
}

private func horizontalDragGesture(y: CGFloat) -> some Gesture {
    DragGesture()
        .updating($dragOffset) { value, state, _ in
            state = value.translation
        }
        .onChanged { value in
            let newY = y + value.translation.height
            guard let index = horizontalLines.firstIndex(of: y) else { return }
            horizontalLines[index] = newY
        }
}

private func verticalDragGesture(x: CGFloat) -> some Gesture {
    DragGesture()
        .updating($dragOffset) { value, state, _ in
            state = value.translation
        }
        .onChanged { value in
            let newX = x + value.translation.width
            guard let index = verticalLines.firstIndex(of: x) else { return }
            verticalLines[index] = newX
        }
}

private func containerDragGesture(geometry: GeometryProxy) -> some Gesture {
    DragGesture()
        .updating($dragOffset) { value, state, _ in
            state = value.translation
        }
        .onEnded { value in
            let offsetX = value.translation.width
            let offsetY = value.translation.height
            let containerRightBorder = geometry.size.width + offsetX
            let containerBottomBorder = geometry.size.height + offsetY
            
            if let rightMostLineX = verticalLines.last, containerRightBorder < rightMostLineX {
                verticalLines[verticalLines.count - 1] = containerRightBorder
            }
            
            if let bottomMostLineY = horizontalLines.last, containerBottomBorder < bottomMostLineY {
                horizontalLines[horizontalLines.count - 1] = containerBottomBorder
            }
        }
}

struct LineView: View {
    var startPoint: CGPoint
    var endPoint: CGPoint
    
    var body: some View {
        Path { path in
            path.move(to: startPoint)
            path.addLine(to: endPoint)
        }
        .stroke(Color.black, lineWidth: 2)
      }
    }
  }

  struct ContentView_Previews: PreviewProvider {
   static var previews: some View {
    ContentView()
   }
 }

这段代码让我在预览和模拟器黑屏,我不明白什么可以错了,它没有给出任何错误。这应该是一个具有交互式内部线条的容器。输出如下所示:

我想知道也许我把输出部分搞砸了,我对Swift很陌生,希望能得到帮助

vddsk6oq

vddsk6oq1#

问题在于LineView中的点。似乎每条线的起点和终点都设置在GeometryReader的范围之外,这导致线不可见。
要解决此问题,您需要按GeometryReader的大小缩放点。
替换
-

ForEach(horizontalLines, id: \.self) { y in
  LineView(startPoint: CGPoint(x: 0, y: y), endPoint: CGPoint(x: geometry.size.width, y: y))
    .gesture(horizontalDragGesture(y: y))
}

与-

ForEach(horizontalLines, id: \.self) { y in
  LineView(startPoint: CGPoint(x: 0, y: y * geometry.size.height / 100), 
         endPoint: CGPoint(x: geometry.size.width, y: y * geometry.size.height / 100))
    .gesture(horizontalDragGesture(y: y)) 
}

与


替换-

ForEach(verticalLines, id: \.self) { x in
  LineView(startPoint: CGPoint(x: x, y: 0), endPoint: CGPoint(x: x, y: geometry.size.height))
    .gesture(verticalDragGesture(x: x))
}

与-

ForEach(verticalLines, id: \.self) { x in
  LineView(startPoint: CGPoint(x: x * geometry.size.width / 100, y: 0), 
         endPoint: CGPoint(x: x * geometry.size.width / 100, y: geometry.size.height))
    .gesture(verticalDragGesture(x: x))
}

相关问题