2014-10-08 4 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

+0

Вы перерисовываете все это в drawRect() - это обычно, как это работает. Тем не менее, вы поэтапно, по вызову вашего таймера update() изменяете, как выглядит путь (в ваших точках добавления точек), поэтому он выглядит как анимация. По сути, каждый раз, когда drawRect() вызывается системой (приводится в движение вашими вызовами setNeedsDisplay()), она рисует несколько другой путь. – davecom

Смежные вопросы