我正在尝试为iOS项目绘制图形均衡器。

均衡器将具有7条,代表不同的频段,而不是根据实时音频数据上下移动。

谁能建议在iOS中解决此问题的最佳方法?

新的频率数据大约为11Hz,因此条形图必须每秒动画11次。

  1. 是否为每个栏创建UIView并动态调整其框架高度?
  2. 是否将条形图绘制为粗CGStrokes,并根据需要在父视图中重新绘制它们?
  3. 另外一个选项?

提前致谢

===============>>#1 票数:1

如果条形图是纯色,则按需调整大小的CALayer可能是最有效的方法。 这样,您还可以选择在尺寸之间进行动画处理。

视图调整大小会触发您不需要的布局周期。 使用CG调用进行绘制非常慢。

显然,唯一真正的发现方法是使用仪器和核心动画工具(在设备上)进行概要分析。 但是从经验来看,图层大小比绘制要快。

===============>>#2 票数:1 已采纳

您想使用Core Animation。 基本原理是创建一堆“图层”对象,这些对象可以是位图图像,矢量形状或文本。 每层都存储在GPU上,大多数操作可以每秒60帧的速度进行动画处理。

可以将层想象成HTML页面中的DOM节点,它们可以相互嵌套,并且可以像CSS一样将属性应用于每个层。 可用的属性列表与GPU可以有效执行的所有操作匹配。

听起来您想要矢量形状。 基本上,您可以在启动时创建所有形状,例如在UIView子类的awakeFromNib方法中。 对于简单的矩形,请使用CALayer并设置背景色。 对于更复杂的形状,请创建CAShapeLayerUIBezierPath ,然后将其与shapeLayer.path = bezierPath.CGPath;一起应用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

注意“核心动画”仅执行2D图形。 Apple拥有Scene Kit,对于3D来说基本上是相同的东西,但到目前为止,它仅在OS X上可用。希望iOS 8包括它,但是直到那时,如果要在iOS上使用3D图形,则需要使用Open GL。

===============>>#3 票数:-1

绝对不是每个UIView,而是整个均衡器的单个UIView。 用适当的CG调用填充drawRect方法以绘制所需的内容。 您可以将视图排队,以根据需要使用适当的数据进行刷新。 利用CADisplayLink可以帮助您获得所需的帧速率。

https://developer.apple.com/library/ios/documentation/QuartzCore/Reference/CADisplayLink_ClassRef/Reference/Reference.html

注意:如果您更喜欢轻于UIView的东西,也可以继承CALayer并在其中进行绘制,但是我认为使用前者会很好。

  ask by bodacious translate from so

未解决问题?本站智能推荐: