我正在尝试为 iOS 项目绘制图形均衡器。
均衡器将有 7 个条,代表不同的频段,并根据实时音频数据上下移动。
谁能建议在 iOS 中解决这个问题的最佳方法?
新的频率数据以大约 11Hz 的频率传入,因此条形必须以每秒 11 次的新大小进行动画处理。
- 我是否为每个栏创建一个 UIView 并动态调整其框架高度?
- 我是否将条形图绘制为粗 CGStroke 并根据需要在父 View 中重新绘制它们?
- 另一种选择?
提前致谢
最佳答案
您想使用 Core Animation。基本原理是创建一堆“层”对象,可以是位图图像、矢量图形或文本。每个层都存储在 GPU 上,大多数操作可以每秒 60 帧的速度进行动画处理。
将层想象成 HTML 页面中的 DOM 节点,它们可以相互嵌套,您可以像 CSS 一样为每个层应用属性。可用属性列表与 GPU 可以高效执行的所有操作相匹配。
听起来您想要矢量形状。基本上,您在启动时创建所有形状,例如在 UIView
子类的 awakeFromNib
方法中。对于简单的矩形,使用 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。
关于ios - 在 iOS 中使用大量动画绘制 View 的最佳 CPU 效率最高的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23184460/