我试图为iOS项目绘制图形均衡器。
均衡器将有7个条形,代表不同的频段,而不是基于实时音频数据上下移动。
有人可以建议在iOS中使用这种方式的最佳方式吗?
新的频率数据大约为11Hz,因此条形图必须以每秒11次的速度动画到新的大小。
提前致谢
答案 0 :(得分:1)
如果条形图是纯色,那么根据需要调整大小的CALayers可能是最有效的方法。这允许您在大小之间选择性地进行动画处理。
查看调整大小触发布局周期,这是您不想要的。使用CG调用绘图非常慢。
显然唯一真正的方法是使用乐器和核心动画工具分析(在设备上)。但从经验来看,图层大小比绘图更快。
答案 1 :(得分:1)
您想使用核心动画。基本原则是创建一堆"层"对象,可以是位图图像,矢量形状或文本。每层都存储在GPU上,大多数操作都可以以每秒60帧的速度进行动画处理。
将层视为HTML页面中的DOM节点,它们可以相互嵌套,并且可以将属性应用于与CSS类似的每个节点。可用的属性列表匹配GPU可以有效执行的所有操作。
听起来你想要矢量形状。基本上,您在启动时创建所有形状,例如在awakeFromNib
子类的UIView
方法中。对于简单的矩形,请使用CALayer
并设置背景颜色。对于更复杂的形状,请创建CAShapeLayer
和UIBezierPath
,然后将其应用于shapeLayer.path = bezierPath.CGPath;
。
然后,只要您想要更改某些内容,就可以将这些更改应用于图层对象。例如,在这里我用1秒线性动画旋转一个图层:
[CATransaction begin];
[CATransaction setAnimationDuration:1];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
[self.needleLayer setValue:[NSNumber numberWithFloat:DegreesToRadians(degrees) forKeyPath:@"transform.rotation.z"];
[CATransaction commit];
// you'll want to declare this somewhere
CGFloat DegreesToRadians(CGFloat degrees)
{
return degrees * M_PI / 180;
}
更复杂的动画,例如计划背靠背执行的一系列更改,可以使用CAKeyframeAnimation
完成:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html
注意Core Animation仅执行2D图形。 Apple的Scene Kit与3D基本相同,但到目前为止它只适用于OS X.希望iOS 8能够包含它,但在此之前,如果你想在iOS上使用3D图形,你需要使用Open GL
答案 2 :(得分:-1)
绝对不是每个UIView - 而是整个均衡器的单个UIView。使用适当的CG调用填充drawRect方法以绘制所需的任何内容。您可以根据需要使用适当的数据对视图进行排队。利用CADisplayLink可以帮助您获得您正在寻找的帧率。
注意:如果你喜欢比UIView更重的东西,你也可以将CALayer子类化并绘制在其中,但我认为你对前者没问题。