2016-07-22 37 views
1

我正在尝试创建一个简单的直线图,它正在实时更新。某种地震仪动画UIBezier获得一条生动的曲线?

我在考虑UIBezierPath,通过只根据输入变量在y轴上移动一个点,我可以创建一条在时间轴上移动的线。

的问题是,你要“推”前面点腾出了新的空间。(所以图中自左向右前进)

任何人可以用一些指导帮助吗?

var myBezier = UIBezierPath() 
     myBezier.moveToPoint(CGPoint(x: 0, y: 0)) 
     myBezier.addLineToPoint(CGPoint(x: 100, y: 0)) 
     myBezier.addLineToPoint(CGPoint(x: 50, y: 100)) 
     myBezier.closePath() 
     UIColor.blackColor().setStroke() 
     myBezier.stroke() 

回答

1

你是对的:你需要推动以前的观点。要么将图形的总宽度分开,使其变得越来越大,而是保留所有数据,或者每次添加新数据到最后时删除第一个点。您需要存储这些点的数组,并且每次都重新创建路径。例如:

//Given... 
let graphWidth: CGFloat = 50 
let graphHeight: CGFloat = 20 
var values: [CGFloat] = [0, 4, 3, 2, 6] 

//Here's how you make your curve... 
var myBezier = UIBezierPath() 
myBezier.moveToPoint(CGPoint(x: 0, y: values.first!)) 
for (index, value) in values.enumerated() { 
    let point = CGPoint(x: CGFloat(index)/CGFloat(values.count) * graphWidth, y: value/values.max()! * graphHeight) 
    myBezier.addLineToPoint(point) 
} 
UIColor.blackColor().setStroke() 
myBezier.stroke() 

//And here's how you'd add a point... 
values.removeFirst() //do this if you want to scroll rather than squish 
values.append(8) 
+0

非常感谢。你能否详细说明“曲线的添加点”?你如何添加一个点(不是一行?) – Curnelious

+0

@Curnelious:我已经编辑了原来的'UIBezierPath'代码,所以你可以看到这个新的'values'数组如何转化为你的旧'UIBezierPath'。这与你正在做的事很相似。 – andyvn22

+0

非常感谢,但是当我想到它时,这将是一个非常闪烁的图形,每次都会像旧示波器一样绘制图形。我正在寻找一种方法来简单地创建一条流畅的线条曲线,而我找不到任何简单的东西。不管怎么说,还是要谢谢你。 – Curnelious