UIPopoverController Перетаскивание - PullRequest
1 голос
/ 25 июня 2011

У меня есть вопрос, на который в основном отвечает этот вопрос .

Однако у меня есть небольшое изменение задачи.Я хочу перетащить UIImageViews из контроллера UIPopover в другой UIView, но количество представлений изображений, содержащихся в всплывающем окне, превышает высоту iPad, а это означает, что пользователи также должны иметь возможность прокручивать содержимое всплывающего окна (которое представлено в UITableView).

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

Любые а) обратная связь о том, является ли это правильным подходом, и б) любые указатели на реализацию?

1 Ответ

3 голосов
/ 01 июля 2011

Я успешно выполнил это и хотел бы поделиться решением.

Поскольку мы имеем дело с UITableView внутри UIPopoverController, первая проблема, с которой вам приходится сталкиваться, это то, что пользователь может просто захотетьчтобы прокрутить представление таблицы, не перетаскивайте содержимое одной из ее ячеек (в данном случае UIImageView).Я решил эту проблему, подключив пользовательский распознаватель жестов к своему классу пользовательского представления изображений, что означает, что к каждому представлению изображения, загруженному в табличное представление, был прикреплен пользовательский распознаватель жестов.

Суть этого распознавателя жестов заключалась в следующемкод внутри метода touchesMoved:

if (ABS(currentTouchLocation.y-self.firstTouchLocation.y) > 4 && ABS(currentTouchLocation.x-self.firstTouchLocation.x)< 2)
{

    self.state = UIGestureRecognizerStateFailed;

}

Причинение сбоя распознавателя жестов позволяет событию касания перейти к представлению таблицы, как обычно.Использование условий> 4 и <2 управляет углом, под которым действие считается вертикальной прокруткой, а не перетаскиванием. </p>

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

self.newImageView =  [[ElementImageView alloc] initWithImage:self.image];
    self.newImageView.frame = [self.superview convertRect:self.frame toView:[UIApplication sharedApplication].keyWindow];

    [[UIApplication sharedApplication].keyWindow addSubview:self.newImageView];

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

Если вы придерживаетесь этого подхода, вы можете легко перетащить копию UIImageView из UITableView / UIPopOverController в любое место на экране.,

...