【问题标题】:NSCollectionView animated re-layoutNSCollectionView 动画重新布局
【发布时间】:2015-11-25 06:04:24
【问题描述】:

我正在为 Mac (10.11) 创建一个简单的应用程序。我有 NSCollectionView,将在其上对对象进行排序。我添加了拖放支持,但 NSCollectionView 没有动画。相反,它会重新加载其内容。

    func collectionView(collectionView: NSCollectionView, writeItemsAtIndexes indexes: NSIndexSet, toPasteboard pasteboard: NSPasteboard) -> Bool {
        let data = NSKeyedArchiver.archivedDataWithRootObject(indexes)
        pasteboard.setData(data, forType: "business_drag")

        return true
    }


    func collectionView(collectionView: NSCollectionView, validateDrop draggingInfo: NSDraggingInfo, proposedIndex proposedDropIndex: UnsafeMutablePointer<Int>, dropOperation proposedDropOperation: UnsafeMutablePointer<NSCollectionViewDropOperation>) -> NSDragOperation {
        return NSDragOperation.Move
    }

    func collectionView(collectionView: NSCollectionView, acceptDrop draggingInfo: NSDraggingInfo, index: Int, dropOperation: NSCollectionViewDropOperation) -> Bool {

        Swift.print("acceptDrop")

        let pasteboard = draggingInfo.draggingPasteboard()
        let data = pasteboard.dataForType("business_drag")
        let indexes = NSKeyedUnarchiver.unarchiveObjectWithData(data!) as! NSIndexSet
        let draggedCell = indexes.firstIndex

        let old = NSIndexPath(forItem: draggedCell, inSection: 0)
        let new = NSIndexPath(forItem: index, inSection: 0)

        collectionView.animator().moveItemAtIndexPath(old, toIndexPath: new)

        // uncommenting this lines makes collectionView reload its conntent
//       let object = collectionView.content.removeAtIndex(draggedCell)
//      collectionView.content.insert(object, atIndex: index)

        return true
    }

我从 AppleDeveloper Portal 下载了示例代码,但它是用 Objective-C 编写的

【问题讨论】:

  • 抱歉回复晚了,您指的是哪个Apple示例代码?

标签: swift macos animation drag-and-drop nscollectionview


【解决方案1】:

您需要确保两件事:

  1. 在调用 moveItemAtIndexPath 之前,请确保您没有将当前动画上下文的持续时间更改为零(默认为 0.25)。您可以使用 NSAnimationContext.currentContext().duration

  2. 更改该值
  3. 确保您已将 CALayer 添加到滚动视图(而不是集合视图)。您可以在 Interface Builder 中打开,也可以使用 wantsLayer以编程方式打开

示例可以参考以下存储库,它是Apple Sample Project CocoaSlideCollection 的翻译版本,它是NSCollectionView 2015 的演示。请查看BrowserWindow.xib 获取CALayer。

https://github.com/ooper-shlab/CocoaSlideCollection-Swift

此外,我还创建了一个视频教程,请查看 19'30"

Youtube:https://youtu.be/fEuiLhYerBA

源代码:https://github.com/harryworld/NSCollectionView-DragDrop

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    相关资源
    最近更新 更多