我有一个具有一个基本图像的UIImageView(在这种情况下,大的建筑物或站点计划或图),然后多个“管脚”可以在计划的顶部被添加(视觉上相似于谷歌地图)的iPad应用。 这些引脚还的UIImageViews和被添加到上轻敲姿势主视图。 基本图像也被添加到上viewDidLoad中主视图。
我有缩放手势的基础图像的工作进行缩放,但很明显,当你放大的基础图像的所有引脚停留在相同的X和基本图像(其x,y和主视图和宽松有相对定位的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
首先,你可以尝试嵌入您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
通话。
更新中...
多亏了“先生 杰弗森在他的回答帮助以上,尽管有不同的实现,我能够通过如下工作这一个...
我有有一个计划/图图像作为一个子视图一个滚动视图。 滚动视图是设置用于缩放/平移等,这包括添加UIScrollViewDelegate到ViewController。
上的计划用户双轻敲/图中的销的图像将作为一个子视图的滚动视图在触摸点。 销图像是自定义的“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];
}
然后我有两个功能用于处理滚动视图的相互作用和该处理相对于平面图像销的缩放/重新定位。 这些方法如下...
- (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将只正常工作的代码。
除此之外,现在的伟大工程! :)
文章来源: iOS - Math help - base image zooms with pinch gesture need overlaid images adjust X/Y coords relative