Получить кадр предварительного просмотра Drag - PullRequest
0 голосов
/ 25 июня 2018

Я реализую drag-n-drop на UICollectionView, используя новый API Apple, представленный в iOS 11.

Что мне нужно, это получить рамку предварительного просмотра (см. Ниже, красный прямоугольник) iOS Drag and drop on UICollectionView

Я пытался определить местоположение перетаскивания:

extension ViewController: UICollectionViewDropDelegate {
    func collectionView(_ collectionView: UICollectionView, 
         dropSessionDidUpdate session: UIDropSession, 
         withDestinationIndexPath destinationIndexPath: IndexPath?) -> UICollectionViewDropProposal {
        let location = session.location(in: collectionView)
    }

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

Я также пытался сохранить y позицию касания в своей ячейке, а затем сделать что-то вроде dragLocation.y - touchLocationInCell.y, но этот подход не точен: похоже, предварительный просмотр получает некоторое смещение от местоположения касания.

Ответы [ 2 ]

0 голосов
/ 23 марта 2019

Я столкнулся с той же проблемой (пытаясь перетащить ячейку события календаря UICollectionView), и я пришел к выводу (как и Алекс Д.), что iOS 11 с представлением «предварительного просмотра» не может решить эту проблему.Тем не менее, я нашел достойное альтернативное решение, которое заключается в создании собственного предварительного просмотра из UICollectionViewCell.snapshot.Затем вы можете перетащить этот вид вокруг, и у вас будет доступ к его позиции, и, как только пользователь "отбросит" вид, создайте новую ячейку на основе позиции пользовательского предварительного просмотра и удалите пользовательский предварительный просмотр.

Вы можете увидеть рабочий пример этого здесь: https://github.com/zjfjack/JZCalendarWeekView/blob/master/JZCalendarWeekView/JZLongPressWeekView.swift#L385

0 голосов
/ 04 июля 2018

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

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

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

Во время операции перетаскивания система создает либо оригинальный снимок представления, либо снимок возвращенного представления.from previewProvider из UIDragItem.

Затем он создает представление контейнера (экземпляр закрытого UIPortalView класса с CAPortalLayer снизу), устанавливает снимок в этот контейнер и отображает представление контейнера.С этого момента позиция предварительного просмотра обрабатывается системой, и нет общедоступного API для доступа к этому представлению.

Единственный возможный способ отследить позицию перетаскивания - использовать функцию location(in view: UIView) протокола UIDragDropSession.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...