在OSX与iOS上

时间:2016-02-15 02:11:06

标签: cocoa cocoa-touch core-graphics quartz-graphics drawrect

我在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];

}

似乎基本上相同的代码在不同的操作系统上产生不同的行为。这有什么理由吗?

0 个答案:

没有答案