簡體   English   中英

SetNeedsDisplay無效

[英]SetNeedsDisplay having no effect

我正在UIContainerView中創建下面描述的類的子視圖。 這些值已正確打印到終端窗口,但在我定義的子視圖中並未實際顯示。 我認為setNeedsDisplay()應該解決這個問題,但是什么也沒有出現。

我正在創建此子視圖為let canvas = Canvas()並嘗試

canvas.setNeedsDisplay()無效。

class Canvas: UIView {

  override func draw(_ rect: CGRect) {

      super.draw(rect)
      guard let context = UIGraphicsGetCurrentContext() else { return }

      context.setStrokeColor(login_theme_color.cgColor)
      context.setLineWidth(10.0)
      context.setLineCap(.butt)

      lines.forEach { (line) in
      for(i, p) in line.enumerated(){
          //context.move(to: p)
          //context.addLine(to: p)
          if i == 0 {
              context.move(to: p)
              print("First point of new line is \(p)")
          }else{
              context.addLine(to: p)
              print("point is \(p)")
          }
      }
  }
       context.strokePath()
}

  var lines = [[CGPoint]]()

  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
      lines.append([CGPoint]())
      //setNeedsDisplay()
  }
  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()
  }

}

為什么將這些值正確打印到終端,但是lines數組實際上不在視圖中顯示這些值? 在此先感謝您的幫助。

我用以下約束定義畫布:

    let canvas = Canvas()

    @objc fileprivate func setupCanvas(){
        //canvas.setNeedsDisplay()
        containerView.addSubview(canvas)
        canvas.translatesAutoresizingMaskIntoConstraints = false
        canvas.topAnchor.constraint(equalTo: rectangle2.topAnchor, constant: 74).isActive = true
        canvas.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor, constant: (view.frame.width/2) + 8).isActive = true
        canvas.rightAnchor.constraint(equalTo: rectangle2.rightAnchor, constant: -4).isActive = true
        canvas.bottomAnchor.constraint(equalTo: howitWorksText.bottomAnchor, constant: 0).isActive = true
        canvas.layer.cornerRadius = 30
        canvas.layer.shadowRadius = 0.5
        canvas.layer.shadowColor = UIColor.white.cgColor
        //canvas.backgroundColor = UIColor.clear
        //canvas.layer.borderWidth = 2.0
        //canvas.layer.borderColor = UIColor.black.cgColor
        canvas.layer.masksToBounds = true
        canvas.backgroundColor = .white
        //canvas.setNeedsDisplay()
    }

並調用setupCanvas()在我ViewDidLoad()

您的坐標不正確,因為您使用了錯誤的參照系。 location(in view:)為視圖指定nil將選擇窗口的坐標空間。 因此,即使您的觸摸是在畫布內部,您的圖形也不是。 您想通過將self而不是nil傳遞給location(in:)來獲得Canvas視圖內部觸摸的坐標。

touchesMoved()更改:

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

至:

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

有關更多信息,請location(in:)的文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM