Перетаскивание из ячейки представления коллекции работает на симуляторе iPad, но не на симуляторе iPhone или реальном устройстве в Swift 4.

Я использую новый API перетаскивания в Swift 4. Мне нужно перетащить ячейку, долго нажимая на нее и перетаскивая изображение в представление контроллера представления. Это перетаскивание в том же приложении, потому что оно должно работать на iPhone, а эта функция работает только на телефоне в том же приложении. Я использую реальное устройство для проверки того, что я пишу, и я не мог понять, почему я не могу перетащить ячейку после нажатия на нее. Но запускаю симулятор на айпаде и... работает, могу перетащить. Я просмотрел документацию Apple, и они указывают, что внешний вид элемента перетаскивания можно настроить во время перетаскивания, но по умолчанию будет перетаскиваться вся ячейка, если нет пользовательской реализации функции делегата или возвращается ноль; так что он все еще должен работать, он делает это в симуляторе на iPad, но не на смоделированных iPhone или реальном. Список кодов ниже. Может быть, кто-то уже прошел через это и знает, как мне помочь. Спасибо. Только соответствующие биты:

class DefineRoomPropertiesVC: UIViewController {

//MARK: - Init.
override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .white
    setupTopMenuBar()
    setupViews()

    topMenuCollectionView.dragDelegate = self
}
   fileprivate let topMenuCollectionView: TopMenuBarCollectionView = {
    let layout = UICollectionViewFlowLayout()
    let collectionView = TopMenuBarCollectionView(frame: .zero, collectionViewLayout: layout)
    return collectionView
}()

}

extension DefineRoomPropertiesVC: UICollectionViewDragDelegate {
func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] { // called when a drag is initiated.
    let image = topMenuCollectionView.imagesForTopSectionCell[indexPath.item]
    let itemProvider = NSItemProvider(object: image)
    let dragItem = UIDragItem(itemProvider: itemProvider)
    return [dragItem]
}

func collectionView(_ collectionView: UICollectionView, dragPreviewParametersForItemAt indexPath: IndexPath) -> UIDragPreviewParameters? {
    return nil

}

person mihai mimi    schedule 11.10.2017    source источник


Ответы (2)


Возможно, вы забыли реализовать некоторые методы делегата. Вот отличное руководство: Программирование для iOS. 11: Как перетаскивать в коллекции и таблицы

Убедитесь, что для флага dragInteractionEnabled установлено значение true.

collectionView.dragInteractionEnabled = true
person Oleh Koval    schedule 22.12.2017

Довольно глупо, но Apple включила взаимодействие перетаскивания для iPad, но установила значение false на iPhone в качестве значения по умолчанию.

Вы бы добавили UIDragInteraction к UIView. Убедитесь, что он включен, установив значение true. В моем коде это выглядит следующим образом.

    let dragInteraction = UIDragInteraction(delegate: self)
    dragInteraction.isEnabled = true
    dragView.addInteraction(dragInteraction)
person rahulg    schedule 29.08.2018
comment
При реализации перетаскивания внутри UICollectionView должен ли я добавлять это внутри метода awakeFromNib ячеек? - person Isuru; 19.04.2020