以编程方式约束时uiview不绘图

Posted

技术标签:

【中文标题】以编程方式约束时uiview不绘图【英文标题】:uiview not drawing when constrained programmatically 【发布时间】:2019-10-26 15:00:05 【问题描述】:

我的代码试图调用一个控制所有绘图属性的类,但 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()

【问题讨论】:

【参考方案1】:

更改以下行

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

到这里

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

lines 数组中存储的点对应于您的 CanvasView 附加到的 superview。您需要存储 CanvasView 对应的点。这正是 self 参数代替上面的 nil 所做的。

【讨论】:

以上是关于以编程方式约束时uiview不绘图的主要内容,如果未能解决你的问题,请参考以下文章

如何在不制作 IBOutlet 的情况下以编程方式在 Swift 中为 UIView 高度约束设置动画?

以编程方式创建的 UIView 约束,未应用锚点

如何以编程方式向以编程方式创建的 UIView 添加约束?

以编程方式向 UIView 添加约束

以编程方式为 uiview 设置约束以支持纵向/横向

以编程方式创建 UIView 后滑块没有响应