我正在开发iOS地图应用,它包含交互式地图。交互式地图是UIImageView的子类,放在scrollView上。我的视图层次结构如下所示:
当用户点击地图的某些部分时,ViewController会执行动画segue(比如放大到地图的那个区域)。我可以从屏幕的任何一点开始segue,但为了正确地做到这一点,我需要用户相对于屏幕本身的精确坐标。由于ImageView位于ScrollView的顶部,因此它使用不同的坐标系,大于屏幕大小。无论如何,地图的哪个区域已被挖掘,重要的是屏幕上的点击CGPoint(物理)。
ImageView使用自己的代码来获取点击的坐标:
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesEnded:touches withEvent:event];
// cancel previous touch ended event
[NSObject cancelPreviousPerformRequestsWithTarget:self];
CGPoint touchPoint = \
[[touches anyObject] locationInView:self];
NSValue* touchValue =\
[NSValue
valueWithCGPoint:touchPoint];
// perform new one
[self
performSelector:@selector(_performHitTestOnArea:)
withObject:touchValue
afterDelay:0.1];
}
如果我放置手势识别器,它可以工作,但ImageView无法进行任何触摸,因此调用segue。
手势识别器的代码,我试图使用:
UITapGestureRecognizer *rec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapRecognized:)];
[someView addGestureRecognizer:rec];
[rec release];
// elsewhere
- (void)tapRecognized:(UITapGestureRecognizer *)recognizer
{
if(recognizer.state == UIGestureRecognizerStateRecognized)
{
CGPoint point = [recognizer locationInView:recognizer.view];
// again, point.x and point.y have the coordinates
}
}
那么,有没有办法在不同的参考系统中获得两个坐标?或者使这些识别器同时工作而不会相互干扰?
解决
我使用此代码将触摸点从一个视图的参考系统转换为
CGPoint pointInViewCoords = [self.parentView convertPoint:self.imageView.touchPoint fromView:self.imageView];
其中self.parentView是层次结构图像上的“视图” - 具有屏幕大小。