Моим решением было использовать пользовательский UIGestureRecognizer
для отслеживания сенсорных событий и отдельный вид для рисования операции перетаскивания.
Это работает, потому что UIGestureRecognizer
не блокирует цепочку респондента.
Из UIGestureRecognizer
документации:
Объекты UIGestureRecognizer не находятся в цепочке респондента, но наблюдают прикосновения, проверенные на попадание, к их представлению и подпредставлениям их представления.
Создайте пользовательский UIViewController
(DragAndDropViewController) и добавьте его представление к родительскому представлению представлений, в которых вы хотите выполнить операцию перетаскивания. Используйте свой класс распознавателя жестов для пересылки сенсорной информации в DragAndDropViewController.
Источник сообщает вашему DragAndDropViewController, откуда происходит перетаскивание (и любая другая информация). Контроллер также должен иметь ссылку делегата на место назначения отбрасывания. Когда происходит сброс, отправьте делегату событие UITouch (не рекомендуется для Apple, но объект UITouch необходим для получения правильного местоположения в представлении назначения).
Вот как выглядит мой DragAndDropViewController:
<code>@protocol DragAndDropDestination</p>
<ul>
<li>(void)droppedItem:(NSDictionary *)item withTouch:(UITouch *)touch;</li>
</ul>
<p>@end</p>
<p>@interface DragAndDropViewController : UIViewController
{
id _dropDestination;
NSDictionary *_draggedItem;
UIImageView *_icon;
}</p>
<p>@property (nonatomic, assign) id dropDestination;
@property (nonatomic, retain) NSDictionary *draggedItem;</p>
<p>// Source sends this message
- (void)startDraggingWithItem:(NSDictionary *)item;</p>
<p>@end
Как только получатель получит сообщение, вы можете использовать - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
, чтобы получить точное представление о месте назначения.
Также убедитесь, что вы отключили cancelsTouchesInView
в распознавателе жестов, если вы хотите, чтобы другие операции пользовательского интерфейса происходили нормально в ваших табличных представлениях.