iPad (4) のユーザーの手書き (カーソル位置) を描画するビューを実装しようとしています。OpenGLを使ったAppleのサンプルコードを見たのですが、理解できない部分があったので、コアグラフィックスを使って実装してみました。
#import "PaintView.h"
#include <stdlib.h>
@implementation PaintView
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if(self) {
//
pointsToDraw = [[NSMutableArray alloc] init];
}
return self;
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
NSLog(@"%@", touch);
CGPoint location = [touch locationInView:self];
CGPoint previousLocation = [touch previousLocationInView:self];
Ink *ink = [[Ink alloc] initWithPoint:previousLocation toPoint:location time:touch.timestamp];
// UITouch *newTouch = [touch copy];
[pointsToDraw addObject:ink];
[self setNeedsDisplay];
}
- (void)drawLine:(CGPoint)startingPoint toPoint:(CGPoint)endingPoint context:(CGContextRef)context
{
// Drawing code
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
CGRect temp = CGRectMake(10, 10, 100, 100);
// Draw them with a 2.0 stroke width so they are a bit more visible.
CGContextSetLineWidth(context, 2.0);
CGContextMoveToPoint(context, startingPoint.x,startingPoint.y); //start at this point
CGContextAddLineToPoint(context, endingPoint.x, endingPoint.y); //draw to this point
// and now draw the Path!
}
- (void)drawRect:(CGRect)rect
{
[super drawRect:rect];
// [self drawLine:CGPointMake(10, 10) toPoint:CGPointMake(30, 30)];
CGContextRef context = UIGraphicsGetCurrentContext();
for (Ink *ink in pointsToDraw){
[self drawLine:ink.point toPoint:ink.previousPoint context:context];
}
CGContextStrokePath(context);
}
@end
問題は、タッチするたびにすべてを描画し (インクは 2 つの CGPOINT とタイム スタンプを含むクラスです)、しばらくすると劇的に遅くなり、かなりの遅延が発生することです。
私の目標は、手書きを正確にキャプチャし、正確に再生できるようにすることです。
考慮すべきもう1つのことは、圧力情報を提供するスタイラスを使用しているため、幅を変えて線を引くことができる必要があるということです.
どんなアドバイスでも大歓迎です。