Определить, находится ли точка на экране в пределах определенного поднабора UIScrollView

UIScrollView содержит несколько объектов UIView; как я могу определить, находится ли точка на экране, не созданная касаниями, в пределах определенного поднабора прокрутки? до сих пор попытки определить, находится ли точка в подвью, всегда возвращают первое подвью в массиве subviews родительского прокрутки, то есть координаты относятся к scrollview, а не к окну.

Вот что я пробовал (отредактировал)

-(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;
}

Ответ 1

Похоже, что вы находитесь относительно окна, и вы хотите, чтобы оно относилось к текущему виду. 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;
}

Ответ 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.