DragAndDropKit-iOS15下一行代碼集成跨應(yīng)用間拖拽傳遞數(shù)據(jù)

前言

前段時間蘋果剛推出了iOS15正式版曼玩,我也是第一時間就升級了體驗。期間體驗到了一個非常有趣的交互如下視頻禽绪。

[圖片上傳失敗...(image-6e15f5-1641800973359)]

如視頻所示妖胀,iOS15下的蘋果系統(tǒng)相冊支持將圖片、視頻猴贰,文本等直接拖拽復(fù)制到其他應(yīng)用(目前親測自帶備忘錄、騰訊QQ等是支持的)。作為一個iOS工程師上煤,第一時間對此產(chǎn)生了濃厚的興趣,第一時間查閱了官方文檔著淆,尋找實現(xiàn)方案劫狠,并以官方Api為基礎(chǔ),設(shè)計了DragAndDropKit,采用Swift編寫永部,自帶Drop独泞、Drag命名空間,支持鏈?zhǔn)秸Z法苔埋,原則上兩行代碼就可以讓您項目支持拖拽資源分享到其他應(yīng)用懦砂。

支持版本

原則上支持iPad OS 11 + , iPhone 是 iOS15+才支持。

參考文檔

drag and drop

下載地址

cocoaPods:


pod 'DragAndDropKit', '0.1.0'

github:

https://github.com/JerryFans/DragAndDropKit

DragAndDropKit演示與用法

[圖片上傳失敗...(image-49125d-1641800973359)]

Drag

拖拽本應(yīng)用的data到其他實現(xiàn)了Drop協(xié)議的應(yīng)用(親測支持系統(tǒng)相冊组橄、備忘錄孕惜、網(wǎng)頁里面的文本選中范圍后直接拖拽等) DragAndDropKit本組件目前支持拖拽UIImage、本地視頻(路徑下的視頻)晨炕、網(wǎng)絡(luò)圖片衫画、網(wǎng)絡(luò)視頻、文本等瓮栗。目前支持UIView及其類UIImageView削罩、UILabel等、以及TableView费奸、CollectionView快速拖動其子Cell弥激。

UIView Drag Usage

最快只需兩行代碼即可實現(xiàn)拖拽,支持鏈?zhǔn)綄懛?/p>


/*
             你想拖拽時候給予的souce, 目前支持NetworkImageDropSource、NetworkVideoDropSource愿阐、ImageDropSource微服、VideoDropSource、TextDropSource五種
             */
            self.networkImageView.drag.dropSource = NetworkImageDropSource(imageUrl: "http://image.jerryfans.com/sample.jpg")
            
            //開啟拖拽
            self.networkImageView.drag.enabled()

以及可選協(xié)議轉(zhuǎn)鏈?zhǔn)介]包

self.networkImageView.drag.enabled().didEndSession { interaction, session, operation in
                
            }.didMoveSession { interaction, session in
                
            }.didPreviewForDragSession { interaction, item, session in
                return
            }.didAllowsMoveOperationSession { interaction, session in
                return false
            }

UICollectionView & UITableView Drag Usage

UICollectionView缨历、UITableView因為實習(xí)的協(xié)議不同以蕴,但本質(zhì)寫法是差不多的糙麦。
兩者enabled后都必須至少實現(xiàn)tableViewDidItemsForBeginning 或 collectionViewDidItemsForBeginning 閉包,返回相應(yīng)的DragItem丛肮。DragItem封裝的也是上面所說的5種DropSource赡磅。

tableView


tableView.drag.enabled().tableViewDidItemsForBeginning { [weak self] tableView, session, indexPath in
                guard let self = self else { return [] }
                //if you are the custom model, you should convert to DropSource Object (Text,Image or Video Drop Source)
                let source = self.models[indexPath.row]
                let itemProvider = NSItemProvider(object: source)
                return [
                    UIDragItem(itemProvider: itemProvider)
                ]
            }

collectionView,如果要實現(xiàn)一些生命周期方法,可以實現(xiàn)一下生命周期閉包宝与,同樣是鏈?zhǔn)秸Z法焚廊。

collectionView.drag.enabled()
            .collectionViewDidItemsForBeginning { [weak self] collectionView, session, indexPath in
                return self?.dragAndDropVM.dragItems(for: indexPath) ?? []
            }.collectionViewWillBeginDragSession { collectionView, session in
                JFPopup.toast(hit: "collection view will begin drag")
            }.collectionViewDidEndDragSession { collectionView, session in
                JFPopup.toast(hit: "collection view did end drag")
            }

[圖片上傳失敗...(image-cae300-1641800973359)] |
image

Drop

從其他應(yīng)用的接收data到到本應(yīng)用(親測支持系統(tǒng)相冊、備忘錄习劫、QQ發(fā)送聊天等) DragAndDropKit本組件目前支持Drop 接收 UIImage咆瘟、本地視頻(路徑下的視頻)、網(wǎng)絡(luò)圖片诽里、網(wǎng)絡(luò)視頻袒餐、文本等。目前也是支持UIView及其類UIImageView须肆、UILabel等匿乃、以及TableView桩皿、CollectionView快速拖動其子Cell豌汇。

Usage

支持類型參數(shù),所有UIView類別泄隔、TableView拒贱、CollectionView、均可賦值supportSources佛嬉,用來聲明drop接收時候能支持的類型數(shù)據(jù)逻澳,默認(rèn)全部支持(Image、Video暖呕、Text)三種斜做。(注:并不是系統(tǒng)api只支持這三種,是這三種比較廣泛湾揽,第一期先支持此三種數(shù)據(jù)的接收)


c.drop.supportSources = [.rawImage,.rawVideo,.text]

UIView Drop, didReceivedDropSource閉包必須實現(xiàn)用以接收到source后你對source的處理瓤逼,其他可選。


self.view.drop.supportSources = [.rawImage]
            self.view.drop.enabled().didReceivedDropSource { [weak self] dropSources in
                for (_, item) in dropSources.enumerated() {
                    if let imageSource = item as? ImageDropSource {
                        self?.imageView.image = imageSource.image
                        self?.imageView.layer.borderWidth = 0.0
                        break
                    }
                }
            }.didEnterDropSession { interaction, session in
                if session.localDragSession == nil {
                    JFPopupView.popup.toast {
                        [.hit("請移入右上角圖片中替換"),
                         .withoutAnimation(true),
                         .position(.top),
                         .autoDismissDuration(.seconds(value: 3)),
                         .bgColor(UIColor.jf.rgb(0x000000, alpha: 0.3))
                        ]
                    }
                }
            }.didUpdateDropSource { [weak self] interaction, session in
                guard let self = self else {
                    return UIDropProposal(operation: UIDropOperation.cancel)
                }
                let dropLocation = session.location(in: self.view)
                
                let operation: UIDropOperation
                
                if self.imageView.frame.contains(dropLocation) {
                    operation = session.localDragSession == nil ? .copy : .move
                    self.checkIsMatch(match: true)
                } else {
                    operation = .cancel
                    self.checkIsMatch(match: false)
                }
                self.updateLayers(forDropLocation: dropLocation)
                
                return UIDropProposal(operation: operation)
            }.didEndDropSession { [weak self] interaction, session in
                guard let self = self else { return }
                let dropLocation = session.location(in: self.view)
                self.updateLayers(forDropLocation: dropLocation)
                self.checkIsMatch(match: false)
            }.didExitDropSession { [weak self] interaction, session in
                guard let self = self else { return }
                self.imageView.layer.borderWidth = 0.0
            }
        }

UICollectionView類似,也是collectionViewDidReceivedDropSource必須處理库物,其他生命周期閉包霸旗,可選。


c.drop.supportSources = [.rawImage,.rawVideo,.text]
            c.drop.enabled().collectionViewDidReceivedDropSource { [weak self] collectionView, coordinator, dropSources in
                let destinationIndexPath: IndexPath
                
                if let indexPath = coordinator.destinationIndexPath {
                    destinationIndexPath = indexPath
                } else {
                    let item = collectionView.numberOfItems(inSection: 0)
                    destinationIndexPath = IndexPath(item: item, section: 0)
                }
                var indexPaths = [IndexPath]()
                for (index, item) in dropSources.enumerated() {
                    let indexPath = IndexPath(item: destinationIndexPath.item + index, section: destinationIndexPath.section)
                    self?.dragAndDropVM.addItem(item, at: indexPath.item)
                    indexPaths.append(indexPath)
                }
                self?.collectionView.insertItems(at: indexPaths)
            }

UITableView類似,也是tableViewDidReceivedDropSource必須處理戚揭,其他生命周期閉包诱告,可選。


t.drop.supportSources = [.rawImage,.rawVideo,.text]
            t.drop.enabled().tableViewDidReceivedDropSource { [weak self] tableView, coordinator, dropSources in
                guard let self = self else { return }
                
                let destinationIndexPath: IndexPath
                
                if let indexPath = coordinator.destinationIndexPath {
                    destinationIndexPath = indexPath
                } else {
                    let item = tableView.numberOfRows(inSection: 0)
                    destinationIndexPath = IndexPath(row: item, section: 0)
                }
                var indexPaths = [IndexPath]()
                for (index, item) in dropSources.enumerated() {
                    let indexPath = IndexPath(row: destinationIndexPath.item + index, section: destinationIndexPath.section)
                    self.models.insert(item, at: indexPath.row)
                    indexPaths.append(indexPath)
                }
                tableView.insertRows(at: indexPaths, with: .bottom)
            }

效果:

[圖片上傳失敗...(image-84abfd-1641800973359)]

后續(xù)支持

  • tableView & collectionView 和系統(tǒng)相冊一樣支持多選拖拽支持(目前只能一個個拖cell)
  • 更多DropSource的支持
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末民晒,一起剝皮案震驚了整個濱河市精居,隨后出現(xiàn)的幾起案子锄禽,更是在濱河造成了極大的恐慌,老刑警劉巖箱蟆,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沟绪,死亡現(xiàn)場離奇詭異,居然都是意外死亡空猜,警方通過查閱死者的電腦和手機绽慈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辈毯,“玉大人坝疼,你說我怎么就攤上這事∽晃郑” “怎么了钝凶?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長唁影。 經(jīng)常有香客問我耕陷,道長,這世上最難降的妖魔是什么据沈? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任哟沫,我火速辦了婚禮,結(jié)果婚禮上锌介,老公的妹妹穿的比我還像新娘嗜诀。我一直安慰自己,他們只是感情好孔祸,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布隆敢。 她就那樣靜靜地躺著,像睡著了一般崔慧。 火紅的嫁衣襯著肌膚如雪拂蝎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天惶室,我揣著相機與錄音温自,去河邊找鬼。 笑死拇涤,一個胖子當(dāng)著我的面吹牛捣作,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鹅士,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼券躁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起也拜,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤以舒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后慢哈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔓钟,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年卵贱,在試婚紗的時候發(fā)現(xiàn)自己被綠了滥沫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡键俱,死狀恐怖兰绣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情编振,我是刑警寧澤缀辩,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站踪央,受9級特大地震影響臀玄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜畅蹂,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一健无、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧魁莉,春花似錦睬涧、人聲如沸募胃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痹束。三九已至检疫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祷嘶,已是汗流浹背屎媳。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留论巍,地道東北人烛谊。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像嘉汰,于是被迫代替她去往敵國和親丹禀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 用到的組件 1、通過CocoaPods安裝 2双泪、第三方類庫安裝 3持搜、第三方服務(wù) 友盟社會化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 14,602評論 1 180
  • ![Flask](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAW...
    極客學(xué)院Wiki閱讀 7,234評論 0 3
  • 不知不覺易趣客已經(jīng)在路上走了快一年了葫盼,感覺也該讓更多朋友認(rèn)識知道易趣客,所以就謝了這篇簡介村斟,已做創(chuàng)業(yè)記事贫导。 易趣客...
    Physher閱讀 3,408評論 1 2
  • 雙胎妊娠有家族遺傳傾向,隨母系遺傳蟆盹。有研究表明脱盲,如果孕婦本人是雙胎之一,她生雙胎的機率為1/58日缨;若孕婦的父親或母...
    鄴水芙蓉hibiscus閱讀 3,695評論 0 2
  • 今天理好了行李钱反,看到快要九點了,就很匆忙的洗頭洗澡匣距,(心存一份念想面哥,你總會打給我的??)然后把洗頭液當(dāng)成沐浴液了??,...
    bevil閱讀 2,768評論 1 1