2010-10-16 1 views
8

Мы добавляем функциональность перетаскивания, чтобы стать спортивным полем с позициями для игроков.iOS - Обнаружение столкновения перетаскиванием Как определить, когда выбранный элемент перетаскивается над другим подвью?

Позиции отображаются с помощью Interface Builder, каждый из которых является отдельным UIImageView.

Мы хотим, чтобы мы могли перетаскивать изображения игроков из стендовых позиций со стороны экрана на позиции на поле.

Как лучше всего определить, когда выбранный игрок, который перемещается вокруг, сталкивается с существующим изображением игрыPosition?

Мы ищем способ обнаружения, если есть вид или ImageView в текущем местоположении.

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint location = [touch locationInView:touch.view]; 
    tile1.center = location; 

    if gamePositionExistsAtCurrentLocation(location) { //want something like this 
    [tile1 setBackgroundColor:[UIColor blueColor]]; 
    } else { 
    [tile1 setBackgroundColor:[UIColor yellowColor]]; 
    } 
} 

ответ

14

проверка, если кадр элемента перемещаемые пересекаются с рамой из на ваших подобозрение

for (UIView *anotherView in self.subviews) { 
    if (movingView == anotherView) 
     continue; 
    if (CGRectIntersectsRect(movingView.frame, anotherView.frame)) { 
     // Do something 
    } 
} 

Если бы я тебя, я хотел бы добавить все игры соответствующих элементов в NSArray и -Убедитесь в этом. Таким образом, вы не обнаруживаете столкновения с subviews, которые не имеют ничего общего с вашей игрой, как ярлыки и так далее.

+0

Таким образом, идея в том, что каждый раз, когда я двигаюсь я бегу через массив объектов и посмотреть, если они совпадают мое текущее местоположение (но с использованием вместо кадра, как вы говорите)? – Evolve

+0

Есть ли какие-либо методы, предоставленные яблоком, которые я могу использовать, чтобы сообщить, какие субподзоры в настоящее время пересекаются с указанной точкой? – Evolve

4

Кроме того, возможно, захотите рассмотреть view.center с CGRectContainsPoint()

+0

Метод принимает следующий формат: CGRectContainsRect (<# CGRect rect1 #>, <#CGRect rect2 #>), как мне представить view.center или location.centre как rect? – Evolve

+0

Не CGRectContainsRect(), я говорил использовать CGRectContainsPoint(). Не используйте первую, если ваш прямоугольник с выделением значительно больше, потому что это возвращает только true, если один прямоугольник полностью внутри другого. – Nimrod

+0

Извини, мой плохой .. пропустите прочитанное сообщение .. спасибо. Отсортировано. Ваше предложение было очень полезным. – Evolve