0

わかりにくいので、問題を示す画像をアップロードします: http://i42.tinypic.com/2eezamo.jpg

基本的に drawRect では、touchesMoved から指のタッチで線を描画し、再描画のために「needsDisplayInRect」を呼び出します。しかし、最初の行が完了し、2行目でrect部分がクリアされるため、以前の描画がいくつかなくなっていることがわかりました。

これが私の実装です:

enter code here

-(void) drawRect:(CGRect)rect{
//[super drawRect: rect];
CGContextRef context = UIGraphicsGetCurrentContext();
[self drawSquiggle:squiggle at:rect inContext:context];
}

- (void)drawSquiggle:(Squiggle *)squiggle at:(CGRect) rect inContext:(CGContextRef)context
{   

CGContextSetBlendMode(context, kCGBlendModeMultiply);
UIColor *squiggleColor = squiggle.strokeColor; // get squiggle's color
CGColorRef colorRef = [squiggleColor CGColor]; // get the CGColor
CGContextSetStrokeColorWithColor(context, colorRef);        

NSMutableArray *points = [squiggle points]; // get points from squiggle
// retrieve the NSValue object and store the value in firstPoint
CGPoint firstPoint; // declare a CGPoint
[[points objectAtIndex:0] getValue:&firstPoint];
// move to the point
CGContextMoveToPoint(context, firstPoint.x, firstPoint.y);
// draw a line from each point to the next in order

for (int i = 1; i < [points count]; i++)
{
    NSValue *value = [points objectAtIndex:i]; // get the next value
    CGPoint point; // declare a new point
    [value getValue:&point]; // store the value in point

    // draw a line to the new point
    CGContextAddLineToPoint(context, point.x, point.y);
} // end for
CGContextStrokePath(context); 
}

これを実装しようとしていますが、期待どおりに機能しないようです。ビューで setNeedsDisplay が呼び出されるたびに正方形を描画するビューを実装しました。CGImageRef 画像と CGBitmapContextRef コンテキストを ivar に入れ、ビューの初期化時にそれらを割り当てます。

#import "View.h"


@implementation View


#define bitsPerComponent 8
#define bitsPerPixel 4*bitsPerComponent
#define bytesPerPixel 4


- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
    lastPoint = CGPointMake(50, 50);
    size_t width = frame.size.width;
    size_t height = frame.size.height;

    CFMutableDataRef data = CFDataCreateMutable( NULL , width * height * bytesPerPixel );  
    CGDataProviderRef provider = CGDataProviderCreateWithCFData( data );
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();

    /*CGImageRef - ivar */ image = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, width*bytesPerPixel, colorspace, kCGImageAlphaPremultipliedLast, provider, NULL, NO, kCGRenderingIntentDefault);
    /*CGBitmapContextRef - ivar */ context = CGBitmapContextCreate(CFDataGetMutableBytePtr(data), width, height, bitsPerComponent, width*bytesPerPixel , colorspace, kCGImageAlphaPremultipliedLast);

    CFRelease( data ); // retained by provider I think
    CGDataProviderRelease( provider ); // retained by image
    CGColorSpaceRelease(colorspace);
}
return self;
}

- (void)drawRect:(CGRect)rect {
NSLog(@"test");
CGContextSetFillColorWithColor(context, [[UIColor blueColor] CGColor]);
CGContextFillRect(context, CGRectMake(lastPoint.x, lastPoint.y, 100, 100));
lastPoint = CGPointMake( ((int)lastPoint.x+50) % 380 , ((int)lastPoint.y+50) % 220 );
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, 100, 100),image);
}

- (void)dealloc {
[super dealloc];
}


@end
4

1 に答える 1

5

UIGraphicsGetCurrentContextinによって返されるグラフィックス コンテキストはdrawRect:、システムによって所有され、描画パスの開始時にクリアされます。独自のCGContext描画を作成して記録し、必要に応じてdrawRect:コンテキストにレンダリングします。

同じを参照し、同じサイズ、色空間、およびその他のプロパティを持つペアのCGBitmapContextとを作成します。適切なタイミングと方法でそのコンテキストに描画し、使用して表示します。CGImageCGDataProviderdrawRect:CGContextDrawImage

または、一連の行を実行しているだけの場合は、 を構築CGMutablePathしてシステム コンテキストにレンダリングできます。

編集:

それぞれのヘッダー ファイルをCGImageCreate参照してください。CGBitmapContextCreateほとんどの引数は同じです。ビットマップ コンテキストは未加工のデータ ポインターを想定していますが、画像は CGDataProvider を想定しています。これは、コードがどのように見えるかの大まかなスケッチです。最後に、コンテキストに描画し、画像を使用して別のコンテキストにレンダリングできます。

size_t width = 400;
size_t height = 300;
CFMutableDataRef data = CFDataCreateMutable( NULL , width * height * 4 ); // 4 is bytes per pixel
CGDataProviderRef provider = CGDataProviderCreateWithCFData( data );
CGImageRef image = CGImageCreate( width , height , ... , provider , ... );
CGBitmapContextRef context = CGBitmapContextCreate( CFDataGetMutableBytePtr( data ) , width , height , ... );
CFRelease( data ); // retained by provider I think
CGDataProviderRelease( provider ); // retained by image

記入する空白がたくさんありますが、これで始められるはずです。バッファには CFData の代わりに malloc を使用できます。

于 2010-04-29T05:19:28.813 に答える