首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SetNeedsDisplay无作用

SetNeedsDisplay无作用
EN

Stack Overflow用户
提问于 2019-08-16 01:14:49
回答 1查看 100关注 0票数 0

我正在UIContainerView中创建一个子视图,它属于下面描述的类。这些值正在正确地打印到终端窗口,但在我正在定义的子视图中并没有实际显示。我认为setNeedsDisplay()应该处理这个问题,但是什么也没有出现。

我正在以let canvas = Canvas()的形式创建这个子视图,并且尝试了

canvas.setNeedsDisplay()不起作用。

代码语言:javascript
复制
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()
  }

}

为什么这些值将正确地打印到终端,而行数组却没有实际显示视图中的值?提前谢谢你的帮助。

我使用以下约束来定义画布:

代码语言:javascript
复制
    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()
    }

然后在我的ViewDidLoad()里打电话给ViewDidLoad()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-16 01:59:23

您的坐标是关闭的,因为您使用了错误的参照系。在nil中为视图指定location(in view:)将选择窗口的坐标空间。所以,即使你的触觉在画布里,你的画却不是。您希望通过将Canvas视图中的self而不是nil传递给location(in:)来获取触摸的坐标。

touchesMoved()变更中:

代码语言:javascript
复制
guard let point = touches.first?.location(in: nil) else { return }

至:

代码语言:javascript
复制
guard let point = touches.first?.location(in: self) else { return }

有关更多信息,请查看location(in:)文档。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57517862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档