在UIImageView上长按手势位置

时间:2015-01-13 07:48:09

标签: ios

我在UIImageview上使用Longpress手势。 UIimageview作为子视图添加在UIscrollview中,滚动视图作为UIview中的子视图添加。我试图在用户执行长按手势的点上绘制一条线到任何其他随机点。随机点将以编程方式设置。目前我的长按手势位置在屏幕上有所不同,我得到的点不同,不知道为什么?我的代码是

- (void)handleLongPressGestures:(UILongPressGestureRecognizer *)sender
{
    NSLog(@"Long Press Gesture");

    CGPoint location = [sender locationInView:self.imageView];


    UIColor * linearcolor=[UIColor whiteColor];

    ///////// code //////


    ////// code end /////






    UIGraphicsBeginImageContext(originalImage.size);


      [originalImage drawAtPoint:CGPointMake(0,0)];



    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetLineWidth(context, 5.0);

     CGPoint * location2;
     location2->x=0.0;
     location2->y=0.0;

       CGContextMoveToPoint(context, location.x, location.y);    
       CGContextAddLineToPoint(context,location2->x,location2->y);
       CGContextSetStrokeColorWithColor(context, [linearcolor CGColor]);
       CGContextStrokePath(context);

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    imageView.image=newImage;




  }

1 个答案:

答案 0 :(得分:0)

图像尺寸与图像视图尺寸不同是很常见的。这导致手势位置呈现在与上下文坐标系不同的坐标系中。您需要使尺寸相同或更优选地将手势位置更改为上下文坐标系。

因此,如果您的图片视图尺寸viewSize和上下文尺寸imageSize以及图片视图viewLocation中的位置,您需要在上下文contextLocation中获取正确的位置。这样做非常简单,只需通过将原点位置除以原点大小再创建一个相对点,然后将其乘以目标大小:

CGPoint relativePoint = CGPointMake(viewLocation.x/viewSize.width, viewLocation.y/viewSize.height);
CGPoint contextLocation = CGPointMake(relativePoint.x* imageSize.width, relativePoint.y* imageSize.height);

或者简单地说:

CGPoint contextLocation = CGPointMake(viewLocation.x*imageSize.width/viewSize.width, viewLocation.y*imageSize.height/viewSize.height);

这通常用于在坐标系之间进行转换,但是在需要包含原点以及诸如其中一个轴被翻转的情况下,事情会变得更加复杂。例如,默认情况下,openGL坐标系将在X轴上,从-1到1,Y轴从1到-1,相对于iOS视图帧。在这种情况下,您可以将手势位置转换为openGL坐标系,如下所示:

CGPoint contextLocation = CGPointMake((viewLocation.x/viewSize.width)*2.0f - 1.0f, (1.0f-viewLocation.y/viewSize.height)*2.0f - 1.0f);

有一天可能会派上用场。