определить, находится ли точка на экране в пределах определенного подпредставления UIScrollView - PullRequest
10 голосов
/ 29 сентября 2010

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 ]

14 голосов
/ 29 сентября 2010

Похоже, что ваша точка относительно окна, а вы хотите ее относительно текущего вида. 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 голосов
/ 05 ноября 2013

Вот что я делаю:

@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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...