Objective c 在NSView中绘制波形

Objective c 在NSView中绘制波形,objective-c,cocoa,opengl,animation,nsview,Objective C,Cocoa,Opengl,Animation,Nsview,我需要在NSView中绘制一个波形。(我有一个数组中的所有样本)。绘图必须高效且快速,无剪切、闪烁等,必须平滑。波形将根据乐曲位置“移动”,采样的一些变化(DSP处理)将实时显示在NSView上,作为视觉表示 我很熟悉在画布对象上绘制线条、圆弧等,我已经开发了做这些事情的应用程序,但不是在Mac OS X上 我想问是否有人能指导我从哪里开始画画!核心动画、OpenGL、简单覆盖绘制方法等。这将是最佳实践-使用API?我将从一个非常长且薄的图像开始,以表示波形的单个条/列 我的计划是有一个NSTi

我需要在NSView中绘制一个波形。(我有一个数组中的所有样本)。绘图必须高效且快速,无剪切、闪烁等,必须平滑。波形将根据乐曲位置“移动”,采样的一些变化(DSP处理)将实时显示在NSView上,作为视觉表示

我很熟悉在画布对象上绘制线条、圆弧等,我已经开发了做这些事情的应用程序,但不是在Mac OS X上


我想问是否有人能指导我从哪里开始画画!核心动画、OpenGL、简单覆盖绘制方法等。这将是最佳实践-使用API?

我将从一个非常长且薄的图像开始,以表示波形的单个条/列

我的计划是有一个NSTimer,每0.01秒将wave one的所有条向左移动一次

循环中也有类似的东西

for (int x; x < [WaveArray count] ; x++)
{
    UIImageView * Bar = [WaveArray ObjectAtIndex: x];
    [Bar setCenter:CGPointMake(Bar.center.x-1,Bar.center.y)];
}
for(int x;x<[WaveArray count];x++)
{
UIImageView*Bar=[WaveArray对象索引:x];
[Bar setCenter:CGPointMake(Bar.center.x-1,Bar.center.y)];
}

现在,您所要做的就是在正确的高度创建对象,并将它们添加到WaveArray中,它们将全部移到左侧。

我将保持简单,并使用使用Cocoa绘图创建一个
NSView
子类,该子类具有
audioData
属性。您可以调用
[view setAudioData:waveArray]
,这将依次调用
[self-setNeedsDisplay:YES]

然后,在
drawRect:
方法中,可以迭代样本并相应地使用
NSRectFill()。这里的
示例
介于0和1之间

- (void)drawRect:(NSRect)dirtyRect {
    [[NSColor blueColor]set];
    for (id sample in self.waveArray) {
        NSRect drawingRect = NSZeroRect;
        drawingRect.origin.x = [self bounds].origin.x;
        drawingRect.origin.y = [self bounds].origin.y + ([self.waveArray indexOfObject:sample]/([self.waveArray count] - 1.0));
        drawingRect.size.width = [self bounds].size.width/[self.waveArray count];
        drawingRect.size.height = [self bounds].size.height * [sample value];
        NSRectFill(drawingRect);
    }
}

此代码不准确,您应该确保只在
dirtyRect

中绘制示例,以提高效率,谢谢您的回答。我的问题是,是否要覆盖NSView的绘图方法来完成您提到的所有事情,或者使用OpenGL、Quartz、只是AppKit等等。我熟悉要使用的技术,但根本不知道要使用哪种API。我实际上需要从视图控制器来完成这一切哈哈。我甚至没有自定义的viewXmm,我需要更高效的东西。。。我想:)(1)UIImageView在Mac OS X上不存在,(2)为什么要在视图控制器中而不是在视图中进行所有绘制?您说-(void)drawRect:(NSRect)rect也被部分调用用于控件的特定rect?无论如何。。。因为[view setAudioData]将强制重新绘制整个控件(由于新的wave数据),所以它可能没那么重要!?或者是吗?
-(void)drawRect:(NSRect)rect
由Cocoa随意调用(永远不应该直接调用),并且可能只需要重新绘制视图的一部分(例如,如果它在滚动视图中)。为了提高效率,您应该只重新绘制需要重新绘制的内容,而不是整个视图
setNeedsDisplay:YES
(应该在
setAudioData:
中调用)告诉视图完全重画。这本书会读得很好的。哦,非常感谢,不过暂时不需要。如果我需要什么,我一定联系!非常感谢!