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很陌生,希望能得到帮助
1条答案
按热度按时间vddsk6oq1#
问题在于LineView中的点。似乎每条线的起点和终点都设置在GeometryReader的范围之外,这导致线不可见。
要解决此问题,您需要按GeometryReader的大小缩放点。
替换 -
与-
与
替换-
与-