Swift: рисование точек в цикле - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь нарисовать несколько точек в цикле, передавая набор точек. Но ни одна точка не рисуется на виду. Идея - я анализирую 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 и добавлен в массив tracepoints.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Ваш код намного сложнее, чем нужно. Одна большая проблема заключается в том, что вы продолжаете добавлять все больше и больше слоев каждый раз, когда вызывается 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)]

Выше можно скопировать на игровую площадку.

0 голосов
/ 28 июня 2018

Черные точки на черном фоне не видны, попробуйте сделать точки белыми:

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

Кроме того, в коде UIViewController вы не добавляете DrawTrace в иерархию представлений, попробуйте в viewDidLoad:

self.view.addSubview(drawTraceInstance)

Наконец, кажется, что вам нужно перебирать массив CGPoint. Вместо использования шага пользователь FastEnumeration через массив:

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