ios - 以编程方式绘制的圆圈不会出现在 SwiftUI 中

标签 ios swift swiftui

我正在尝试使用 SwiftUI 创建一个测试应用程序,用户在屏幕上拖动时可以在屏幕上绘图。但是,我在显示用来代表笔的圆圈时遇到了一些困难。

这是我正在使用的 ContentView.swift 代码。

import SwiftUI

var list_of_points = [CGPoint]()

struct ContentView: View {
    var body: some View {
        ZStack{
            Rectangle().fill(Color.gray)
            Text("Hello!")
        }.gesture(DragGesture().onChanged({
            value in
            drag_responder(point: value.location)
            
        }))
    }
}

func drag_responder(point: CGPoint){
    print("Drawing at \(point)")
    
    list_of_points.append(point)
    let pen = Circle().size(CGSize(width:10, height:10)).position(point)
    pen
}


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

最佳答案

import SwiftUI

struct Drawing {
    var points: [CGPoint] = [CGPoint]()
}

struct ContentView: View {
    @State private var currentDrawing: Drawing = Drawing()
    @State private var drawings: [Drawing] = [Drawing]()
    @State private var color: Color = Color.black
    @State private var lineWidth: CGFloat = 3.0
    
    var body: some View {
        VStack(alignment: .center) {
            DrawingPad(currentDrawing: $currentDrawing,
                       drawings: $drawings,
                       color: $color,
                       lineWidth: $lineWidth)
        }
    }
}

struct DrawingPad: View {
    @Binding var currentDrawing: Drawing
    @Binding var drawings: [Drawing]
    @Binding var color: Color
    @Binding var lineWidth: CGFloat
    
    var body: some View {
        GeometryReader { geometry in
            Path { path in
                for drawing in self.drawings {
                    self.add(drawing: drawing, toPath: &path)
                }
                self.add(drawing: self.currentDrawing, toPath: &path)
            }
            .stroke(self.color, lineWidth: self.lineWidth)
                .background(Color(white: 0.95))
                .gesture(
                    DragGesture(minimumDistance: 0.1)
                        .onChanged({ (value) in
                            let currentPoint = value.location
                            if currentPoint.y >= 0
                                && currentPoint.y < geometry.size.height {
                                self.currentDrawing.points.append(currentPoint)
                            }
                        })
                        .onEnded({ (value) in
                            self.drawings.append(self.currentDrawing)
                            self.currentDrawing = Drawing()
                        })
            )
        }
        .frame(maxHeight: .infinity)
    }
    
    private func add(drawing: Drawing, toPath path: inout Path) {
        let points = drawing.points
        if points.count > 1 {
            for i in 0..<points.count-1 {
                let current = points[i]
                let next = points[i+1]
                path.move(to: current)
                path.addLine(to: next)
            }
        }
    }
    
}

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

关于ios - 以编程方式绘制的圆圈不会出现在 SwiftUI 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64176722/

相关文章:

ios - 为什么 customTableViewCell 不同且速度慢?

ios - 如何让 UIScrollView 垂直滚动,其中包含动态数量的 subview ?

ios - 在SWIFT中解析JSON API到WIFI和4G的不同结果

ios - 快速将 PFGeoPoint 纬度和经度从解析转换为 CLLocation 纬度和经度

scrollview - 使用 SwiftUI 加载更多功能

iOS 中的 Android 操作栏

ios - Facebook 登录和 FBSDKLoginKit Pod 之间的差异以及使用哪一个?

ios - 从一个 View Controller 切换到另一个 View Controller 时出错

swiftui - SwiftUI 中 DragGesture 和 ScrollView 的交互

ios - SwiftUI Map 不以注释为中心