0

グラフのさまざまな要素をリアルタイムで描画するために、多数のレイヤー (約 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];
4

1 に答える 1

0

ビューのサブクラスに「FFTlayer.h」をインポートしましたか?

レイヤー初期化の後に追加してみてください:

fftLayer.delegate = fftLayer;
于 2013-10-06T06:56:09.817 に答える