2

我有一个 iPad 应用程序,它有一个基本图像 UIImageView(在这种情况下是一个大型建筑物或场地平面图或图表),然后可以在平面图顶部添加多个“图钉”(视觉上类似于谷歌地图)。这些引脚也是 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;
        }
    }
}

我需要帮助来计算数学以重新定位引脚 x/y 坐标,以在放大或缩小的计划/图表上保持相对位置。引脚显然不希望在宽度或高度方面进行缩放/缩放 - 它们只需要相对于计划中初始位置的新 x 和 y 坐标。

我自己尝试过计算,但一直在努力解决,不幸的是,我对 SDK 的了解还不够,无法知道是否有内置的可用条款来提供帮助。

非常感谢您对这个数学相关问题的帮助!:)

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

4

2 回答 2

2

首先,您可以尝试将您的嵌入UIImageView到一个UIScrollView缩放中,这样您就可以在很大程度上完成了。然后,您可以轻松设置最大和最小比例,并且可以根据需要滚动缩放的图像(特别是如果您的图钉是 的子视图UIImageView或内部的其他内容UIScrollView)。

至于缩放引脚的位置,我认为存储每个引脚的原始 x 和 y 坐标会起作用(即,当视图首次加载时,当它们首次定位时,比例为 1.0)。然后当视图被缩放时,设置x = (originalX * zoomScale)y = (originalY * zoomScale)

几年前,我在 iOS 应用程序中遇到了同样的问题,如果我没记错的话,这就是我完成它的方式。

编辑:下面是有关我如何完成此操作的更多详细信息(我现在正在查看我的旧代码)。

我有一个UIScrollView作为我的主视图的子视图,我UIImageView作为一个子视图。我的按钮被添加到滚动视图中,并且我保留了它们的原始位置(缩放 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. 我的按钮按比例缩放,但我没有在上面的代码中包含它。如果您发现引脚的大小自动缩放,您可能必须存储它们的原始大小以及原始坐标并在setFrame调用中使用它。

于 2012-05-22T20:17:25.147 回答
0

更新...

感谢'先生。杰斐逊在上面的回答中提供了帮助,尽管实现方式不同,但我能够通过以下方式完成这一工作......

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

在用户双击计划/图表时,一个 pin 图像作为子视图添加到触摸点的滚动视图。pin 图像是一个自定义的“ZonePin”类,它继承自 UIImageView,并具有一些附加属性,包括“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 轴底部对齐。

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

除此之外,它现在工作得很好!:)

于 2012-05-25T09:59:52.833 回答