从集合视图单元格拖动适用于 iPad 模拟器,但不适用于 iPhone 模拟器或 Swift 4 中的真实设备

mih*_*imi 1 drag-and-drop swift4

我在 swift 4 中使用新的拖放 api。我需要通过长按它来拖动一个单元格并将图像放在视图控制器的视图上。这是在同一个应用中拖拽,因为它需要在iPhone上运行,而这个功能只在同一个应用中的手机上运行。我使用真实设备来测试我所写的内容,但我无法弄清楚为什么一旦我点击了一个单元格就无法拖动它。但是在 iPad 上运行模拟器......它有效,我可以拖动它。我已经查看了苹果的文档,他们指定可以在拖动过程中配置拖动项的外观,但默认情况下,如果不存在委托函数的自定义实现或返回 nil,则将拖动整个单元格;所以它应该仍然有效,它在 iPad 上的模拟器中执行此操作,但不在模拟 iPhone 或真实 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
}()
Run Code Online (Sandbox Code Playgroud)

}

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

}
Run Code Online (Sandbox Code Playgroud)

小智 7

也许你忘了实现一些委托的方法。这是很棒的教程:iOS 11 编码:如何拖放到集合和表格中

确保将dragInteractionEnabled标志设置为true

collectionView.dragInteractionEnabled = true
Run Code Online (Sandbox Code Playgroud)