Сравнение местоположения UITouch с прямоугольником UIImageView

У меня есть следующий код, чтобы определить, находится ли касание в представлении изображения в ячейке моей таблицы. Однако это не работает. Я сравнил их с CGRectContainsPoint, но это не работает. Вот код:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event    
{
     // Declare the touch and get it's location

     UITouch *touch = [touches anyObject];

     CGPoint touchLocation = [touch locationInView:self];

     if (CGRectContainsPoint(myImageView.frame, touchLocation))
     {
        NSLog(@"Tapped image view");
     }    
}

Спасибо за помощь!


person skylerl    schedule 08.02.2010    source источник


Ответы (4)


Однако это не работает.

Пожалуйста, будьте более конкретными.

 UITouch *touch = [touches anyObject];

Почему бы не исследовать каждое касание, а не просто случайный * их выбор?

* В документации для anyObject сказано, что вам не гарантируется, какой именно вариант вам будет предоставлен. Вам даже не гарантируется, что он будет случайным; каждый раз это может быть один и тот же объект. Закон Мерфи гласит, что независимо от того, случайный он или нет, он будет неправильным.

 CGPoint touchLocation = [touch locationInView:self];
 if (CGRectContainsPoint(myImageView.frame, touchLocation))

Ваш frame находится в системе координат вашего супервизора; [touch locationInView:self] возвращает точку касания в вашей системе координат. Вы хотите протестировать в bounds, который находится в вашей системе координат. В документации объясняется разница.

person Peter Hosey    schedule 08.02.2010
comment
раскрытие: CGPoint touchLocation = [touch locationInView:self]; if (CGRectContainsPoint(myImageView.frame, touchLocation)) работает, только если myImageView является прямым подвидом self - person João Portela; 01.02.2012
comment
расширяя комментарий Жоао, вы можете получить фрейм подпредставления относительно супервизора (или любого вида) с помощью CGRect frameRelativeToView = [myImageView convertRect:myImageView.bounds toView:self] - person chazzwozzer; 06.11.2013

Проблема в том, что вам нужно вызвать [touch locationInView: myImageView], чтобы получить точку в системе координат представлений изображений. Затем проверьте, не попал ли он в кадр.

person bstahlhood    schedule 20.02.2010

UITouch *touch = [[event allTouches] anyObject];
CGPoint location = [touch locationInView:self];
if ([touch view]==view) {
view.center=location;
}

напишите это в сенсорном перенесенном событии. спасибо

person user986045    schedule 29.10.2011

Помните, что когда вы запрашиваете прикосновение для locationInView :, вы получаете точку относительно кадра этого представления. Итак, предполагая, что предоставленный вами фрагмент кода содержится в подклассе UIViewController, вы должны запросить

CGPoint touchLocation = [touch locationInView:self.view];

Это даст вам точку зрения относительно вашего взгляда. Причина, по которой вам нужна точка относительно вашего текущего представления, заключается в том, что рамка вашего представления изображения также относительно его родительского представления - того же представления. Итак, теперь это должно работать.

 if (CGRectContainsPoint(myImageView.frame, touchLocation)) {
    NSLog(@"Tapped image view");
 }
person Johnus    schedule 14.09.2010