2014-10-08 105 views
0

我想要製作實時應用程序的一條線在時間上移動。所以我想不斷給貝塞爾曲線添加值。要測試它,我在做:動態添加值到UIBezierPath

import UIKit 

class TestView: UIView { 
var arr = [CGPointMake(0, 0), CGPointMake(120, 150), CGPointMake(260, 150), CGPointMake(210, 30)] 
var control = CGPointMake(5, 5) 
let path = UIBezierPath() 
var count = 0 

override func drawRect(rect: CGRect) { 
    path.lineWidth = 3.0 
    path.moveToPoint(CGPointMake(20, 40)) 
    path.addQuadCurveToPoint(arr[1], controlPoint: control) 
    path.stroke() 

    var timer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: Selector("update"), userInfo: nil, repeats: true) 

} 

func update() { 
    var p = arr[count] 

    path.addQuadCurveToPoint(p, controlPoint: control) 
    path.stroke() 
    count++ 
} 

} 

我會清理它,但這似乎並不奏效。它畫出最初的線條,但是沒有其他的點被添加。

有沒有更好的方法呢?

回答

1

有幾點讓你在正確的方向:

  • 你不應該開始你的計時器從的drawRect()。考慮從視圖控制器的viewDidAppear()方法開始。
  • drawRect()在每次視圖被告知重繪時調用;所以現在不知道關於你的程序的任何其他信息,我猜測它只被調用一次。
  • 您應該在drawRect()中執行所有繪圖,而不是在update()中。
  • 將點添加到update()中的路徑中,然後調用setNeedsDisplay()以實際獲取系統調用的drawRect(),以及stroke()drawRect()中的路徑。

希望這有助於!

+0

謝謝!我想知道,這會重新繪製整條曲線還是隻添加新曲線?因爲最終我想製作一個動畫,使其看起來像曲線正在移動,如果這是有道理的。因此重新繪製整條線不會是最好的。但我會給你一槍! – Jonovono 2014-10-08 14:58:44

+0

你在drawRect()中重繪了整個事物 - 通常它是如何工作的。但是,通過定時器的update()調用,您可以逐漸改變路徑的外觀(在您的情況下添加點),使其看起來像動畫。實質上,每次drawRect()都被系統調用(通過調用setNeedsDisplay()進行調用),它正在繪製一條稍微不同的路徑。 – davecom 2014-10-08 19:48:35