每当有新数据时更新UIView的最佳方法

时间:2018-08-21 16:35:24

标签: ios swift uiview cgpoint

我有一个UIView,我想在有新数据可用时进行更新。这里有一些上下文:我有一个数据结构,只要用户单击“开始”按钮,它就会实时实时更新。数据结构随时间接收矢量数据,并且每几秒钟添加一次新的矢量数据。我试图将矢量数据绘制到UIView上的方法是使用CGPoints。而且,我希望能够调用一个函数,为该函数提供一组CGPoint,并在向新数据添加到数据结构的同时在UIView上画一条线。最好的方法是什么?

到目前为止,这是我的全部内容,但是没有任何线条可以绘制到UIVIew上:

class VectorDraw: UIView {

  var origin: CGPoint = .zero
  var point2: CGPoint = .zero


  override func draw(_ rect: CGRect) {

      //Declaring context and its properties (i.e its width and color)
      let context = UIGraphicsGetCurrentContext()
      context?.setLineWidth(3.0)
      context?.setStrokeColor(UIColor.purple.cgColor)

      //Context directions, what to do with the context a move - addLine = stroke
      context?.move(to: origin)
      context?.addLine(to: point2)

      //Actually draws line
      context?.strokePath()
      print("Line drawn from origin at x: ", origin.x, "\tat y: ", origin.y)
      print("To terminal point at x: ", point2.x, "\tat y: ", point2.y)
  }
}

我的想法是仅在按下开始按钮时更改CGPoint,然后调用vectorDraw.setNeedsLayout(),但UIView不会更新。出现的唯一行是当应用打开时我将CGPoints设置为不同的坐标。

2 个答案:

答案 0 :(得分:0)

是否有其他事情向VectorDraw提供坐标,并且您希望VectorDraw在每次坐标供应商更新时重绘?您必须将新坐标重新提供给VectorDraw,然后在setNeedsDisplay()上调用VectorDraw函数以重新渲染视图

答案 1 :(得分:0)

所以我知道了。我遇到的问题是我没有更新实际视图,而是要绘制线条时使用的类视图实例。

这是一个代码示例:我有一个变量var vectorDraw = VectorDraw(),并且我试图像这样vectorDraw.setNeedsDisplay()更新视图。问题在于这不是实际的视图。它只是VectorDraw的对象变量。我发现的解决方案(通过查看此示例获得了https://github.com/fujianjin6471/DemosForBlog/tree/master/SetNeedsDisplay)是您需要将实际的视图从主情节提要板连接到ViewController,我完全以某种方式错过了它。如果您将视图从控件拖到ViewController,则会得到一个类似@IBOutlet var vectorDrawView: VectorDraw!的变量。这是您需要用来调用setNeedsDisplay()的变量,您的视图将更新!