Ios UIImageView上的长按手势位置

Ios UIImageView上的长按手势位置,ios,Ios,我正在UIImageview上使用长按手势。UIimageview作为子视图添加到UIscrollview中,滚动视图作为子视图添加到UIview中。我试图在图像上从用户执行长按手势的点到任何其他随机点画一条线。随机点将通过编程进行设置。目前,我的长按手势在屏幕上的位置与我所在的点不同得到是不同的不知道为什么?我的代码是 - (void)handleLongPressGestures:(UILongPressGestureRecognizer *)sender { NSLog(@"Lon

我正在UIImageview上使用长按手势。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;




  }

图像大小与图像视图大小不同是很常见的。这将导致手势位置显示在与上下文坐标系不同的坐标系中。您需要使大小相同,或者最好将手势位置更改为上下文坐标系

因此,如果您有图像视图大小
viewSize
和上下文大小
imageSize
以及图像视图中的位置
viewslocation
,则需要在上下文
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);
这通常用于坐标系之间的转换,但在需要同时包含原点和轴翻转的情况下,情况可能会变得更复杂。例如,默认情况下,相对于iOS视图框架,openGL坐标系在X轴上从-1到1,在Y轴上从1到-1。在这种情况下,您可以将手势位置转换为openGL坐标系,如下所示:

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

有一天可能会派上用场。

如果图像大小与从中收集触摸位置的图像视图大小相同,请检查您的方法。此外,图像视图的原点位于(0,0)。@MaticOblak请详细说明(在发布的方法中创建一个断点,并记录图像大小和图像视图框架,以确认识别器的位置和正在绘制的上下文上的位置实际上具有相同的坐标系,仅当图像大小等于图像视图的大小且图像视图的原点位于(0,0)。所以打印图像大小并打印图像视图框。@MaticOblak非常感谢您的精心设计……效果很好。图像框不等于图像大小。:)@MaticOblak是否有其他方法来解决此问题。我的意思是,如果我不想根据帧更改图像的大小,该怎么办。意味着图像大小将不同,帧也将不同。那么,我如何根据UIImageview帧映射手势位置。我再次需要您的帮助。现在我为UIIma添加了放大功能geView。当再次放大我的图像时,它没有指向确切的位置,但在正常模式下工作正常。尽管我得到了相对位置…:(是的,您的图像视图现在有一个转换,因为它很可能由缩放代理方法返回。您应该做的是创建一个与图像视图大小相同的空视图。将图像视图添加到此空视图。将空视图添加到滚动视图。在代理方法中返回空视图。从imag收集手势位置。)e查看与您之前的操作相同。其余代码应相同。再次感谢…现在它工作正常。获取有关页面滚动及其区域的一些小问题,但我希望它能很快得到解决。:)您能检查此问题吗。。。。