Определить, находится ли точка на экране в пределах определенного поднабора 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.