我在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;
}
答案 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);
有一天可能会派上用场。