我在drawRect:
上实施了NSView
回调,目的是从我的mac上的麦克风中绘制实时波形。我会快速从NSTimer拨打setNeedsDisplay:Yes
这个drawRect:
代码可以非常平滑地呈现一些波动到麦克风输入的波段。 (我将原始音频数据转储到我的音频对象单例的数组属性中,NSView用于绘制调用。这个问题是关于绘图而不是数据)。这是Cocoa代码,每0.01秒产生一次平滑的绘图:
- (void)drawRect:(NSRect)dirtyRect {
NSBezierPath *bez = [NSBezierPath bezierPath];
float startingX = 0;
float numOfBandLines = 1024;
float spectralWidth = self.bounds.size.width / numOfBandLines;
for (int i = 0; i < numOfBandLines; i++) {
CGFloat sampleValue = [SineWavePlayer sharedInstance].amplitude.values[i];
float yPos = alexMap(sampleValue, 0, 1, 0, self.bounds.size.height);
[bez moveToPoint:CGPointMake(startingX, 0)];
[bez lineToPoint:CGPointMake(startingX, yPos)];
startingX += spectralWidth;
}
NSColor * color = [NSColor colorWithCalibratedHue:1 saturation:1 brightness:1 alpha:1];
[color set];
[bez setLineWidth:1];
[bez stroke];
}
但是,当尝试将其移植到iOS时,绘图会在每次调用时重叠。因此,在几秒钟之后有多条带线,其中应该有一条带线每0.01秒调整一次。 (Cocoa中的行为)。 (为简单起见,此代码只有一行基于第零个数组元素中的数据连续绘制):
- (void)drawRect:(CGRect)rect {
[super drawRect:rect];
UIBezierPath *bez = [UIBezierPath bezierPath];
CGFloat sampleValue = alexMap([MicController sharedInstance].amplitude.values[0], 0, 1, 0, 100);
[bez moveToPoint:CGPointMake(50, 50)];
[bez addLineToPoint:CGPointMake(100, 100 + sampleValue)];
UIColor * color = [UIColor redColor];
[color set];
[bez setLineWidth:1];
[bez stroke];
}
似乎基本上相同的代码在不同的操作系统上产生不同的行为。这有什么理由吗?