确定屏幕上的点是否在特定的UIScrollView子视图中

时间:2010-09-28 20:13:19

标签: iphone objective-c ipad

UIScrollView包含几个UIView对象;如何判断屏幕上没有触摸生成的点是否在滚动视图的特定子视图内?到目前为止,尝试确定点是否在子视图中总是返回父滚动视图的子视图数组中的第一个子视图,即坐标是相对于滚动视图而不是窗口。

这是我尝试过的(编辑过的)

-(UIView *)viewVisibleInScrollView 
{ 
    CGPoint point = CGPointMake(512, 384); 
    for (UIView *myView in theScrollView.subviews) 
    { 
        if(CGRectContainsPoint([myView frame], point)) 
        { 
            NSLog(@"In View"); 
            return myView; 
        } 
    } 
    return nil;
}

2 个答案:

答案 0 :(得分:14)

看起来你的点是相对于窗口的,并且你想要它相对于当前视图。 convertPoint:fromView:应该对此有所帮助。

这里可能存在错误,但看起来应该是这样的:

-(UIView *)viewVisibleInScrollView 
{ 
    CGPoint point = CGPointMake(512, 384); 
    CGPoint relativePoint = [theScrollView convertPoint:point fromView:nil]; // Using nil converts from the window coordinates.
    for (UIView *myView in theScrollView.subviews) 
    { 
        if(CGRectContainsPoint([myView frame], relativePoint)) 
        { 
            NSLog(@"In View"); 
            return myView; 
        } 
    } 
    return nil;
}

答案 1 :(得分:2)

这就是我的所作所为:

@implementation UIScrollView (FOO)
- (id)foo_subviewAtPoint:(CGPoint)point
{
    point.x += self.contentOffset.x;
    for (UIView *subview in self.subviews) {
        if (CGRectContainsPoint(subview.frame, point)) {
            return subview;
        }
    }
    return nil;
}
@end

以下是我如何使用它:

CGPoint center = [scrollView convertPoint:scrollView.center fromView:scrollView.superview];
UIView *view = [scrollView foo_subviewAtPoint:center];

有些注意事项:

  • 传递给foo_subviewAtPoint:的点是,表示在滚动视图的坐标系中。这就是为什么在上面的代码中我必须将center转换为其超视图的坐标系。
  • 我正在使用iOS 6.1+和布局限制。我从未测试过其他任何代码,所以YMMV。