как программировать перетаскивание с привязкой к области в Objective-C для IOS - PullRequest
9 голосов
/ 10 февраля 2012

Я хочу реализовать что-то в Objective-C для платформы IOS.

Я хочу иметь два объекта с графическим интерфейсом, просто скажем, что они являются UIImages для простоты и имеют квадратную форму.

А потом у меня есть «пустой» элемент GUI, который представляет собой просто серый квадрат того же размера.

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

Также я хотел бы иметь 2 других квадратных изображения и еще один пустой квадрат, такой же с таким же взаимодействием, но каждая группа из 2 изображений и 1пустой квадрат не может работать между собой.то есть первые два изображения могут быть сброшены только в первый пустой квадрат.

Я предполагаю, что будет какое-то событие отбрасывания, которое я хочу захватить, а затем определю, совпадают ли метаданные изображения с пустым квадратом, которым оно является

Если вам известны какие-либо примеры кода или приложения, я, конечно, могу разобраться в коде, чтобы понять, или если у вас есть какие-то объекты, события и свойства, на которые я бы указывал, было бы здорово.

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

1 Ответ

13 голосов
/ 10 февраля 2012

Вы можете достичь этого довольно легко.К изображению вы прикрепляете UILongPressGestureRecognizer, а в методе действия вы обновляете положение изображения на основе движения пальца.Получить текущее местоположение жеста с помощью - (CGPoint)locationInView:(UIView *).После каждого движения вы можете проверить, перекрывает ли рамка изображения кадр вашей целевой области, и, если это так, защелкнуть его на место.

Проверка наложения довольно проста (данное изображение и цель являются частьюта же иерархия представления):

CGRect imageRect = [image convertRect:image.frame toView:[image superview]];
CGRect targetRect = [target convertRect:target.frame toView:[image superview]];
if (CGRectIntersectsRect(imageRect, targetRect)) {
    // overlap
}

Чтобы переместить изображение назад, если пользователь выпал из окна, вы можете сделать рамку или центр анимации назад в исходное положение.Итак, когда начинается перетаскивание, вызывается ваш метод действия.Вы проверяете, не равна ли ваша переменная экземпляра, назовем ее originalCenter , CGPointZero.Если это так, вы записываете текущий центр в originalCenter.

Затем, когда пользователь отбрасывает изображение и размер объекта превышает его, вы перемещаете его назад:

[UIView animateWithDuration:0.2
                 animations:^{
                     image.center = originalCenter;
                     self.originalCenter = CGPointZero;
                  }];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...