Может быть, вы должны иметь представление "доска" обрабатывать все перетаскивания.Когда начинается касание и в этой точке появляется плитка, начинайте ее перетаскивать.В противном случае проверяйте всякий раз, когда касание перемещается, и как только вы найдете плитку, начинайте ее перетаскивать.
Вы можете переопределить hitTest:withEvent:
в виде доски, чтобы он все еще мог определять, когда касание касается плитки, новсегда возвращайте себя, чтобы сенсорные события переходили в представление доски (например, запишите подпредставление, которое было обработано в отдельной переменной-члене, чтобы вы знали, что нужно перетаскивать позже, когда сенсорные события начинают поступать).
Подробнее
При обработке касаний UIView будет использовать hitTest, чтобы найти представление, которое должно получать события касания.Реализация по умолчанию проверяет каждое подпредставление, так что самое глубокое подпредставление в иерархии получает прикосновения.Чтобы представление на доске получало прикосновения, вам нужно отключить userInteraction на всех видах плиток.Но это означает, что вы не можете использовать hitTest, чтобы найти плитку, к которой прикоснулись, так как она игнорирует представления, у которых отключено userInteraction.
Так что я говорю, что оставьте userInteraction включенным на сенсорных представлениях.Но переопределите hitTest в представлении доски так, чтобы он сначала вызывал супер реализацию, чтобы найти плитку (если результат self
, сама доска была поражена).Не нужно реализовывать свой собственный поиск плитки.Примерно так:
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
UIView *hitView = [super hitTest:point withEvent:event];
if ( hitView != self )
self.draggingTile = hitView;
return self;
}
Теперь вы знаете, какую плитку перемещать в touchesMoved
.Однако я не думаю, что hitTest вызывается при перемещении касания, поэтому, если плитка еще не была подобрана, вам, возможно, придется вызывать ее вручную (вы можете получить point
и event
от касания, переданногоtouchesMoved
.