我正在尝试实现一个为iPad(4)绘制用户手写(光标位置)的视图。我看到Apple的示例代码,它使用OpenGL,然而,有些部分我无法理解,因此,我尝试使用核心图形来实现它。
#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
问题是,我每次触摸都会画一切(墨水是一个包含两个CGPOINT和一个时间戳的类),过了一段时间,这会大大减慢创建实质性延迟的速度。
我的目标是能够以精确的方式捕捉手写内容并精确播放。
另外需要考虑的是,我正在使用一个提供压力信息的手写笔,所以我需要能够在改变宽度时画出我的线条。
非常感谢任何建议。
答案 0 :(得分:1)
不是将点存储在数组中,而是将它们存储在数组和UIBezierPath中。然后你只需要在drawRect中绘制bezier路径:而不是设置整个方案。
手写笔不提供压力信息 - 至少在iOS上没有。 iPhone的电容式触摸屏不具有电阻性。更改宽度的标准算法是使用速度作为因子,并使用您填写的小三角形绘制以创建线条。
有趣!以下是相关文章:http://www.nearinfinity.com/blogs/jason_harwig/2012/11/06/capture-a-signature-on-ios.html