使用UIPinchGeustureRecognizer绘制线条
问题描述:
我想使用UIPinchGeustureRecognizer画线,我尝试了所有的stackoverflow解决方案,但没有运气。请帮我解决这个问题。我得到以下错误使用UIPinchGeustureRecognizer绘制线条
首先,我想知道我的代码逻辑是否正确,我没有从touchbegan/touchmoved获得点。我从(void)handleLinePinch获取两点:(UIPinchGestureRecognizer *)手势而已。
//My instances in .h file
CGPoint location1,location2;
LineView* l;
- (void)viewDidLoad
{
[super viewDidLoad];
l = [[LineView alloc]initWithFrame:self.view.frame];
[self.view addSubview:l];
UIPinchGestureRecognizer *linepinch = [[UIPinchGestureRecognizer alloc]
initWithTarget:l action:@selector(handleLinePinch:)];
[l addGestureRecognizer:linepinch];
}
- (void)handleLinePinch:(UIPinchGestureRecognizer *)gesture
{
NSUInteger num_touches = [gesture numberOfTouches];
// save locations to some instance variables, like `CGPoint location1, location2;`
if (num_touches >= 1) {
location1 = [gesture locationOfTouch:0 inView:l];
}
if (num_touches >= 2) {
location2 = [gesture locationOfTouch:1 inView:l];
}
[l drawRect:location1 Loc2:location2];
[l setNeedsDisplay];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
}
LineView.m
- (void)drawRect:(CGPoint)location1 Loc2:(CGPoint)location2 {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 5.0);
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGFloat components[] = {0.0, 0.0, 1.0, 1.0};
CGColorRef color = CGColorCreate(colorspace, components);
CGContextSetStrokeColorWithColor(context, color);
CGContextMoveToPoint(context, location1.x, location1.y);
CGContextAddLineToPoint(context, location2.x, location2.y);
CGContextStrokePath(context);
CGColorSpaceRelease(colorspace);
CGColorRelease(color);
}
答
你必须继承的UIView
并覆盖drawRect:
方法,你UIGraphicsGetCurrentContext
得到CGContextRef
无效出来drawRect:
方法,并没有建立一个强有力的参考图形上下文,因为它可以调用之间改变drawRect:方法。
当您识别捏合手势时,将CGPoint传递给视图并将setNeedsDisplay
方法发送给它。
总是使用setNeedsDisplay
刷新视图,请不要直接发送drawRect:
。
LineView.m
- (void)drawRect:(CGRect)rect
{
// p1 and p2 should be set before call `setNeedsDisplay` method
[self drawRect:location1 Loc2:location2] ;
}
- (void)drawRect:(CGPoint)location1 Loc2:(CGPoint)location2 {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 5.0);
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGFloat components[] = {0.0, 0.0, 1.0, 1.0};
CGColorRef color = CGColorCreate(colorspace, components);
CGContextSetStrokeColorWithColor(context, color);
CGContextMoveToPoint(context, location1.x, location1.y);
CGContextAddLineToPoint(context, location2.x, location2.y);
CGContextStrokePath(context);
CGColorSpaceRelease(colorspace);
CGColorRelease(color);
}
编辑:我假设你只画线的时候两个手指上。
- (void)handleLinePinch:(UIPinchGestureRecognizer *)gesture
{
NSUInteger num_touches = [gesture numberOfTouches];
// save locations to some instance variables, like `CGPoint location1, location2;`
if (num_touches == 2) {
location1 = [gesture locationOfTouch:0 inView:l];
location2 = [gesture locationOfTouch:1 inView:l];
}
// you need save location1 and location2 to `l` and refresh `l`.
// for example: l.location1 = location1; l.location2 = location2;
[l setNeedsDisplay];
}
从哪里读我更新的location1和location2值?我的意思是touchesBegan/Moved或from(void)handleLinePinch?来自'handleLinePinch:'的 – user3714144 2014-09-17 07:17:25
@ user3714144。 – KudoCC 2014-09-17 07:49:40
我已经完成了,它的工作正常..事情是如何检测绘制线拖动线。 – user3714144 2014-09-18 06:26:52