以编程方式约束时未绘制视图

问题描述 投票:0回答:1

我的代码正在尝试调用一个控制所有图形属性的类,并且uiview上没有任何显示。就像没有在调用该类,但我知道它在被调用。我不知道该怎么办。重要的是画布必须覆盖特定区域,而不是整个视图,这就是为什么我要对其进行编程来限制它。

var canvas = Canvas()

override func viewDidLoad() {
    super.viewDidLoad()

    canvas.backgroundColor = .black
    setupLayout()
    canvas.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(canvas)

    NSLayoutConstraint.activate ([
          canvas.trailingAnchor.constraint(equalTo: view.centerXAnchor, constant :150),
          canvas.topAnchor.constraint(equalTo: view.centerYAnchor, constant : 0),
          canvas.widthAnchor.constraint(equalToConstant: 300),
          canvas.heightAnchor.constraint(equalToConstant: 300),
    ])
}


class Canvas: UIView {

// public function
func undo() {
    _ = lines.popLast()
    setNeedsDisplay()
}

func clear() {
    lines.removeAll()
    setNeedsDisplay()
}

fileprivate var lines = [[CGPoint]]()

override func draw(_ rect: CGRect) {
    super.draw(rect)

    guard let context = UIGraphicsGetCurrentContext() else { return }

    context.setStrokeColor(UIColor.red.cgColor)
    context.setLineWidth(5)
    context.setLineCap(.butt)

    lines.forEach { (line) in
        for (i, p) in line.enumerated() {
            if i == 0 {
                context.move(to: p)
            } else {
                context.addLine(to: p)
            }
        }
    }

    context.strokePath()
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    lines.append([CGPoint]())
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let point = touches.first?.location(in: nil) else { return }
    guard var lastLine = lines.popLast() else { return }
    lastLine.append(point)
    lines.append(lastLine)
    setNeedsDisplay()
}}
swift view uiview subclass nslayoutconstraint
1个回答
1
投票

更改下一行

guard let point = touches.first?.location(in: nil) else { return }

对此

guard let point = touches.first?.location(in: self) else { return }

存储在lines数组中的点与CanvasView所附加到的超级视图相对应。您需要存储与CanvasView相对应的点。这正是self参数代替上面的[[nil所做的事情。

© www.soinside.com 2019 - 2024. All rights reserved.