帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:HTTP  THIS  COM  
This is a companion to the http://karmadust.com/drag-and-drop-between-uicollectionviews/ tutorial

  • 源代码名称:KDDragAndDropCollectionView
  • 源代码网址:http://www.github.com/mmick66/KDDragAndDropCollectionView
  • KDDragAndDropCollectionView源代码文档
  • KDDragAndDropCollectionView源代码下载
  • Git URL:
    git://www.github.com/mmick66/KDDragAndDropCollectionView.git
  • Git Clone代码到本地:
    git clone http://www.github.com/mmick66/KDDragAndDropCollectionView
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/mmick66/KDDragAndDropCollectionView
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
  • 拖放集合视图

    它是为 Swift 4.0编写的,它是跨多个UICollectionViews拖放数据的实现。

    Drag and Drop Illustration

    Appetize.io 上试试

    要求

    • iOS 8.0 +
    • XCode 9.0 +
    • 快速 4.0 +

    安装

    Cocoa Pods

    我在集成 Cocoa 吊舱时遇到问题,所以我已经把它禁用了。 欢迎任何帮助。

    手册

    KDDragAndDropManager.swiftKDDragAndDropCollectionView.swift 添加到项目中。

    快速指南

    使感兴趣的UICollectionView成为 KDDragAndDropCollectionView

    XCode Interface Builder Screen

    然后将一个类设置为实现 KDDragAndDropCollectionViewDataSource 协议。

    classViewController: UIViewController, KDDragAndDropCollectionViewDataSource {
     @IBOutletweakvar firstCollectionView: KDDragAndDropCollectionView!@IBOutletweakvar secondCollectionView: KDDragAndDropCollectionView!@IBOutletweakvar thirdCollectionView: KDDragAndDropCollectionView!var data : [[DataItem]] = [[DataItem]]() // just for this example 
     var dragAndDropManager : KDDragAndDropManager?overridefuncviewDidLoad() {
     let all = [firstCollectionView, secondCollectionView, thirdCollectionView]
     self.dragAndDropManager=KDDragAndDropManager(canvas: self.view, collectionViews: all)
     }
    }

    用户代码的唯一职责是管理集合视图单元表示的数据。 集合视图的数据源必须实现 KDDragAndDropCollectionViewDataSource 协议。

    在这个例子中,我们有 3 UICollectionViews区分他们的标签( 坏实践,我知道-。 但是它只是一个例子,一个数据 array,分别保存 3个数组。 在这种情况下,上述实现的实现可能是:

    funccollectionView(collectionView: UICollectionView, dataItemForIndexPathindexPath: NSIndexPath) ->AnyObject {
     return data[collectionView.tag][indexPath.item]
    }funccollectionView(collectionView: UICollectionView, insertDataItemdataItem : AnyObject, atIndexPathindexPath: NSIndexPath) ->Void {
     iflet di = dataItem as? DataItem {
     data[collectionView.tag].insert(di, atIndex: indexPath.item)
     }
    }funccollectionView(collectionView: UICollectionView, deleteDataItemAtIndexPathindexPath : NSIndexPath) ->Void {
     data[collectionView.tag].removeAtIndex(indexPath.item)
    }funccollectionView(collectionView: UICollectionView, moveDataItemFromIndexPathfrom: NSIndexPath, toIndexPathto : NSIndexPath) ->Void {
     let fromDataItem: DataItem = data[collectionView.tag][from.item]
     data[collectionView.tag].removeAtIndex(from.item)
     data[collectionView.tag].insert(fromDataItem, atIndex: to.item) 
    }funccollectionView(_collectionView: UICollectionView, indexPathForDataItemdataItem: AnyObject) -> IndexPath? {
     guardlet candidate = dataItem as? DataItem else { returnnil }
     for (i,item) in data[collectionView.tag].enumerated() {
     if candidate != item { continue }
     returnIndexPath(item: i, section: 0)
     }
     returnnil}

    高级使用

    防止拖放特定的项目和/或者丢弃

    除了由拥有收集集合视图的数据的控制器实现的数据源协议之外,还有两个更有趣的协议: KDDraggableKDDroppable。这些是直接由 KDDragAndDropCollectionView 实现的,并且考虑了更精细地控制所拖动的内容。

    访问它们的更简单的方法是子类化 KDDragAndDropCollectionView 并重写默认实现。 例如我们可能不希望从视图中删除特定项:

    classMyCV: KDDragAndDropCollectionView {
     overridefunccanDropAtRect(_rect: CGRect) ->Bool {
     let condition =/* custom logic that results to (for example).. . */falsereturnsuper.canDropAtRect(rect) && condition
     }
    }
    数据项和 Equatable

    在这个项目的示例代码中,我创建了一个 DataItem 类来表示由集合视图显示的数据。

    classDataItem : Equatable{
     var indexes:Stringvar colour: UIColor
     init(indexes: String, colour: UIColor = UIColor.clear) {
     self.indexes= indexes
     self.colour= colour
     }
     staticfunc==(lhs: DataItem, rhs: DataItem) ->Bool {
     return lhs.indexes== rhs.indexes&& lhs.colour== rhs.colour }
    }

    在开发过程中,你将制作自己的类型,这些类型必须与上面的Equatable 协议一样。 每个数据项必须为 ,因此在创建可以具有重复显示值例如 "拼字"类型游戏的单元格时,要小心,同时显示相同的字母。 在这样的情况下,一个简单的标识符将实现相等。

    你自己做

    如果你想深入了解这个逻辑,那么关于它如何构建的完整教程可以在 karmadust博客找到。

    许可证

    麻省理工学院许可证( MIT )

    版权所有( c ) 2015 Karmadust有限公司。

    若要在取得该软件副本时免费授予任何人,如有下列条件的软件,请免费授予该软件的副本,并与相关的文档文件("软件") 进行许可,包括不受限制的权利,包括以下条件:

    上述版权声明和本许可声明须包括在所有的副本或实质性部分的软件。

    软件是"是",没有任何保证,表示或者隐含,包括但不限于销售,适合特定用途和 NONINFRINGEMENT。 作者或者版权持有人在合同。侵权或者它的他与软件或者它的他用户交易的行为。



    文章标签:COM  HTTP  THIS  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语