【问题标题】:Swift : drawing the dots in loop斯威夫特:在循环中画点
【发布时间】:2018-06-27 20:20:11
【问题描述】:

我试图通过传递一组点在一个循环中绘制多个点。但没有一个点被绘制在视图上。想法 - 我正在解析 xml 文档并提取点以将其绘制在视图上。

   Edit - I have updated the code with suggested changes and it is working. 

            //View Class
            class DrawTrace: UIView
{

    var points = [CGPoint]()
    {
        didSet {
            setNeedsDisplay()
        }
    }

override  func draw(_ rect: CGRect)
    {
        let size = CGSize(width: 1, height: 1)
        UIColor.white.set()
        for point in points
        {
            print(point.x,point.y)
            let dot = UIBezierPath(ovalIn: CGRect(origin: point, size: size))

            dot.fill()
        }
    }



}
 //View Controller Class  

    class ViewController: UIViewController
    {
        var object : traceDoc =  traceDoc()
        let trace = DrawTrace(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
        override func viewDidLoad()
        {

            super.viewDidLoad()
            object.collectionOfData()
            trace.points = object.tracePoints
            self.view.addSubview(trace)
        }
    }

将视图实例添加到视图控制器中的视图层次结构。创建 DrawTrace 实例并附加到跟踪点数组。

【问题讨论】:

  • 在哪里添加trace 到视图层次结构中?
  • 我忘记将视图实例添加到视图层次结构中。我感谢您的帮助。谢谢

标签: ios swift core-graphics uibezierpath


【解决方案1】:

您的代码比它需要的复杂得多。一个大问题是,每次调用 draw 时,您都会不断添加越来越多的层。

在您的自定义视图中无需使用图层来绘制点。这是一个更简单的解决方案:

class DrawTrace: UIView
{
    var points = [CGPoint]() {
        didSet {
            setNeedsDisplay()
        }
    }

    override func draw(_ rect: CGRect)
    {
        let size = CGSize(width: 2, height: 2)

        UIColor.black.set()
        for point in points {
            let dot = UIBezierPath(ovalIn: CGRect(origin: point, size: size))
            // this just draws the circle by filling it.
            // Update any properties of the path as needed.
            // Use dot.stroke() if you need an outline around the circle.
            dot.fill()
        }
    }
}

let trace = DrawTrace(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
trace.backgroundColor = .white
trace.points = [ CGPoint(x: 10, y: 10), CGPoint(x: 35, y: 100)]

以上可以复制到游乐场。

【讨论】:

  • 感谢您的评论。我使用您的代码建议编辑应用程序。仍然没有运气:(
  • 那你还有一个问题。我的答案中的代码在 Swift 游乐场中完美运行。你实际上得到了什么结果? draw 方法甚至被调用了吗?你确定你实际上是在创建一个DrawTrace 视图并设置一些点吗?
  • 我观察到一些事情 - draw 方法没有被调用。我在另一个类中创建 DrawTrace 实例并在该类中附加点数组。我已经编辑了问题中的代码。谢谢
【解决方案2】:

黑色视图上的黑色点不可见,尝试将点设置为白色:

shapeLayer.fillColor = UIColor.white.cgColor
shapeLayer.strokeColor = UIColor.white.cgColor

另外,在 UIViewController 代码中,您没有将 DrawTrace 添加到视图层次结构中,请在 viewDidLoad 中尝试:

self.view.addSubview(drawTraceInstance)

最后,您似乎必须遍历 CGPoint 数组。代替使用 stride,用户 FastEnumeration over Array:

for point in points
{
    drawDot(x: point.x, y: point.y,Color: fillColor, size: size)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-22
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 2016-02-08
    • 2017-11-13
    相关资源
    最近更新 更多