グラフのさまざまな要素をリアルタイムで描画するために、多数のレイヤー (約 9) を含む UIview を実装しています。以前にこれらを 9 つの異なる UIView として実装し、drawRect() 関数を使用して描画したところ、問題なく動作しましたが、非常に遅かったです。私がオンラインで見つけたものから、CALayers がはるかに高速になるようです。この変更を行うために、CALayer をサブクラス化し、drawinContext: 関数のみをオーバーライドしました。これが私のCALayer.mファイルの全体です
#import "FFTLayer.h"
@implementation FFTLayer
@synthesize strokeColor,points,numPoints;
-(void)display{
[self drawInContext:UIGraphicsGetCurrentContext()];
NSLog(@"displaying!!");
[super display];
}
-(void)drawInContext:(CGContextRef)ctx
{
NSLog(@"drawing in context!");
CGContextSetStrokeColorWithColor(ctx, strokeColor);
CGContextStrokeLineSegments(ctx, points, numPoints*2);
}
@end
私はさまざまなことを試しました。しかし、これまでのところ、 drawInContext: を呼び出すことができた唯一の方法は、それを display() メソッドで呼び出すことであり、これは間違っているようです。drawInContext を呼び出しても、Xcode は描画コンテキストが無効であると通知します。これは、FFTlayerに自分自身を呼び出すように指示するために使用しているコードです。
context = UIGraphicsGetCurrentContext();
[self.layer addSublayer:fftLayer];
[fftLayer setPoints:fft_points];
[fftLayer drawInContext:context];
[fftLayer setNeedsDisplay];
[self performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:NO];
CALAyers についてオンラインで数日間読んだ後でも、CALAyers を適切に使用する方法と、これが最も効率的で正しい方法であるかどうかについて、まだかなり混乱しています。「FFTLayer」クラス名から判断できない場合のために、私はグラフィック担当者ではなく、オーディオ担当者です :)
どんな助けでも大歓迎です!!
編集:
次の方法ですべてのレイヤーを設定しました
//FFT Graph Layer
fftLayer = [[FFTLayer alloc] init];
fftLayer.backgroundColor = [UIColor clearColor].CGColor;
fftLayer.frame = self.layer.bounds;
[fftLayer setNumPoints:nP];
[fftLayer setStrokeColor:fft_strokeColor];