iOS – math帮助 – 缩放手势的基础图像缩放需要覆盖图像相对调整X / Y坐标

我有一个iPad应用程序,它有一个基本的图像UIImageView(在这种情况下,一个大型的build筑或网站计划或图),然后可以在计划的顶部(视觉上类似于谷歌地图)添加多个“引脚”。 这些引脚也是UIImageViews,并添加到轻拍手势的主视图。 基础图像也被添加到viewDidLoad的主视图中。

我有基本图像与缩放手势缩放工作,但很显然,当您缩放基本图像时,所有的引脚停留在主视图的相同的x和y坐标,松散那里相对定位的基本图像(其中x,y和宽度,高度坐标已经改变)。

到目前为止,我有这个…

- (IBAction)planZoom:(UIPinchGestureRecognizer *) recognizer; { recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale); recognizer.scale = 1; for (ZonePin *pin in planContainer.subviews) { if ([pin isKindOfClass:[ZonePin class]]){ CGRect pinFrame = pin.frame; // **************************************** // code to reposition the pins goes here... // **************************************** pin.frame = pinFrame; } } } 

我需要帮助来计算math来重新定位针x / y坐标,以保留在放大或缩小计划/图中的相对位置。 这些引脚显然不希望根据它们的宽度或高度进行缩放/缩放 – 它们只需要新的x和y坐标,这些坐标是相对于平面上初始位置的。

我试图自己计算math,但一直努力工作,不幸的是我还不熟悉SDK足以知道是否有内置的帮助。

帮助这个math相关的问题将非常感激! 🙂

非常感谢,迈克尔。 InNeedOfMathTuition.com

首先,你可以尝试在UIScrollViewembedded你的UIImageView ,这样缩放在很大程度上为你完成。 然后你可以很容易地设置最大和最小比例,你可以根据需要滚动缩放图像(特别是如果你的引脚是UIImageView子视图或UIScrollView内的其他东西)。

至于缩放引脚的位置,我认为这将存储每个引脚的原始x和y坐标(即视图第一次加载时,当它们第一次定位,在规模1.0)。 然后当视图放大时,设置x = (originalX * zoomScale)y = (originalY * zoomScale)

几年前,我在iOS应用程序中遇到了同样的问题,如果我记得正确的话,我就是这样做的。

编辑 :下面是我如何做到这一点(我现在看我的旧代码)的更多细节。

我有一个UIScrollView作为我的主视图的子视图,我的UIImageView作为子视图。 我的button被添加到滚动视图,我保留其原来的位置(放大1.0)存储作为参考。

-(void)scrollViewDidScroll:(UIScrollView *)scrollView方法:

 for (id element in myButtons) { UIButton *theButton = (UIButton *)element; CGPoint originalPoint = //get original location however you want [theButton setFrame:CGRectMake( (originalPoint.x - theButton.frame.size.width / 2) * scrollView.zoomScale, (originalPoint.y - theButton.frame.size.height / 2) * scrollView.zoomScale, theButton.frame.size.width, theButton.frame.size.height)]; } 

对于-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView方法,我返回了我的UIImageView 。 我的button的大小缩放,但我没有包括在上面的代码。 如果您发现引脚自动缩放,则可能必须存储原始大小以及原始坐标,并在setFrame调用中使用它们。

更新中…

感谢“先生 杰斐逊在上面的回答中提供了帮助,尽pipe实施方式不同,但我能够通过以下方式来完成这一项:

我有一个scrollview有一个计划/图图像作为子视图。 scrollView被设置为缩放/平移等,这包括添加UIScrollViewDelegate到ViewController。

在用户双击计划/图表时,针图像作为子视图添加到触点的scrollView。 针图像是一个自定义的“ZonePin”类,从UIImageViewinheritance,并有一些额外的属性,包括“baseX”和“baseY”。

添加引脚的代码…

 - (IBAction)planDoubleTap:(UITapGestureRecognizer *) recognizer; { UIImage *image = [UIImage imageNamed:@"Pin.png"]; ZonePin *newPin = [[ZonePin alloc] initWithImage:image]; CGPoint touchPoint = [recognizer locationInView:planContainer]; CGFloat placementX = touchPoint.x - (image.size.width / 2); CGFloat placementY = touchPoint.y - image.size.height; newPin.frame = CGRectMake(placementX, placementY, image.size.width, image.size.height); newPin.zoneRef = [NSString stringWithFormat:@"%@%d", @"BF", pinSeq++]; newPin.baseX = placementX; newPin.baseY = placementY; [planContainer addSubview:newPin]; } 

然后我有两个函数来处理scrollView交互,并处理相对于平面图像的缩放/重新定位引脚。 这些方法如下…

 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { return planImage; } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { for (ZonePin *pin in planContainer.subviews) { if ([pin isKindOfClass:[ZonePin class]]){ CGFloat newX, newY; newX = (pin.baseX * scrollView.zoomScale) + (((pin.frame.size.width * scrollView.zoomScale) - pin.frame.size.width) / 2); newY = (pin.baseY * scrollView.zoomScale) + ((pin.frame.size.height * scrollView.zoomScale) - pin.frame.size.height); CGRect pinFrame = pin.frame; pinFrame.origin.x = newX; pinFrame.origin.y = newY; pin.frame = pinFrame; } } } 

作为参考,计算引脚的位置,由它们的性质是引脚将引脚图像居中在x轴上,但是具有y轴向下alignment。

我唯一需要做的就是在放大时添加引脚时,反转scrollViewDidScroll方法中使用的计算。上面添加引脚的代码只有在scrollView.zoomScale为1.0时才能正常工作。

除此之外,现在效果很好! 🙂