UICollectionViewCell 移動(dòng)攻略

最近產(chǎn)品出了一個(gè)需要移動(dòng)UICollectionViewCell需求刮萌,其中有點(diǎn)小挫折,與大家分享一下卫袒。

UICollectionView移動(dòng)前提條件:

iOS版本必須大于iOS 9.0

Apple官方文檔叁执,關(guān)于UICollectionView移動(dòng)方法如下:

    // Support for reordering
    @available(iOS 9.0, *)
    open func beginInteractiveMovementForItem(at indexPath: IndexPath) -> Bool // returns NO if reordering was prevented from beginning - otherwise YES

    @available(iOS 9.0, *)
    open func updateInteractiveMovementTargetPosition(_ targetPosition: CGPoint)

    @available(iOS 9.0, *)
    open func endInteractiveMovement()

    @available(iOS 9.0, *)
    open func cancelInteractiveMovement()

進(jìn)入正文,給UICollectionView增加移動(dòng)步驟如下

1. 給collectionView增加長(zhǎng)按手勢(shì)
2. 在手勢(shì)識(shí)別中油猫,設(shè)置各種移動(dòng)事件
3. 在delegate設(shè)置對(duì)應(yīng)cell是否可以移動(dòng)
4. 在delegate中交換數(shù)據(jù)
5. 設(shè)置不可參與移動(dòng)的IndexPath

具體代碼如下:

import DKImagePickerController

class CommodityImageEditVC: UIViewController {
    // 選取圖片框架
    var assets = [DKAsset]()
    
    let commodityImageEditCellID = "CommodityImageEditCellID"
    
    // 欄加載
    lazy var gridView: UICollectionView = {
        let flowLayout = UICollectionViewFlowLayout()
        flowLayout.itemSize = CGSize(width: 162.0, height: 162.0)
        flowLayout.sectionInset = UIEdgeInsets(top: 20, left: 50, bottom: 20, right: 50)
        flowLayout.minimumLineSpacing = 32.0
        
        let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: flowLayout)
        collectionView.backgroundColor = UIColor.white
        collectionView.register(CommodityImageEditCell.self, forCellWithReuseIdentifier: commodityImageEditCellID)
        collectionView.dataSource = self
        collectionView.delegate = self
        return collectionView;
    }()
    

    
    // MARK: - life cycle
    override func viewDidLoad() {
        super.viewDidLoad()

        setupView()
        
    }
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        // 設(shè)置表格視圖大小
        gridView.frame = CGRect(x: 0, y: 0, width: view.width, height: view.height)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // MARK: - setup view
    func setupView() {
        
        view.addSubview(gridView)
        
        setUpLongPressGesture()
    }
    
    /**
     給gridView增加長(zhǎng)按事件
     */
    func setUpLongPressGesture() {
        let longPress = UILongPressGestureRecognizer(target: self, action: #selector(longPressMoving(longPress:)))
        gridView.addGestureRecognizer(longPress)
    }

}


// MARK: - 長(zhǎng)按手勢(shì)識(shí)別
extension CommodityImageEditVC {
    
    @objc func longPressMoving(longPress: UILongPressGestureRecognizer) {
        // 獲取長(zhǎng)按點(diǎn)
        let point = longPress.location(in: longPress.view)
        
        if #available(iOS 9, *) {
            switch longPress.state {
            case .began:
                // 根據(jù)長(zhǎng)按點(diǎn)稠茂,獲取對(duì)應(yīng)cell的IndexPath
                guard let indexPath = gridView.indexPathForItem(at: point) else {
                    return
                }
                gridView.beginInteractiveMovementForItem(at: indexPath)
                
            case .changed:
                
                gridView.updateInteractiveMovementTargetPosition(point)
                
                
            case .ended:
                gridView.endInteractiveMovement()
            default:
                gridView.cancelInteractiveMovement()
            }
        }
    }
    
}

// MARK: - dataSource delegate
extension CommodityImageEditVC: UICollectionViewDataSource, UICollectionViewDelegate {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return assets.count + 1
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: commodityImageEditCellID, for: indexPath) as? CommodityImageEditCell
        if indexPath.row == assets.count {
            cell?.cellType = .add
        } else {
            cell?.cellType = .image
            cell?.updateCell(asset: assets[indexPath.row])
        }
        return cell!
    }
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        // 判斷選中的是否為增加圖片選項(xiàng)
        guard let cell = collectionView.cellForItem(at: indexPath) as? CommodityImageEditCell else {
            return
        }
        guard cell.cellType == .add else {
            return
        }
        let pickerController = DKImagePickerController()
        pickerController.didSelectAssets = {(assets: [DKAsset]) in
            self.assets.append(contentsOf: assets)
            self.gridView.reloadData()
        }
        present(pickerController, animated: true, completion: nil)
    }
    
    // 設(shè)置最后一個(gè)不可參與移動(dòng)
    func collectionView(_ collectionView: UICollectionView, targetIndexPathForMoveFromItemAt originalIndexPath: IndexPath, toProposedIndexPath proposedIndexPath: IndexPath) -> IndexPath {
        if proposedIndexPath.item == assets.count {
            return originalIndexPath
        }
        if originalIndexPath.item == assets.count {
            return originalIndexPath
        }
        return proposedIndexPath
    }
    
    // 設(shè)置是否可以移動(dòng)
    func collectionView(_ collectionView: UICollectionView, canMoveItemAt indexPath: IndexPath) -> Bool {
        if indexPath.row == assets.count {
            return false
        } else {
            return true
        }
        
    }
    
    func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        // 移動(dòng)后交換數(shù)據(jù)
        let moveData = assets.remove(at: sourceIndexPath.row)
        assets.insert(moveData, at: destinationIndexPath.row)
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市情妖,隨后出現(xiàn)的幾起案子睬关,更是在濱河造成了極大的恐慌,老刑警劉巖毡证,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件电爹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡料睛,警方通過(guò)查閱死者的電腦和手機(jī)丐箩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)摇邦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人屎勘,你說(shuō)我怎么就攤上這事涎嚼。” “怎么了挑秉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵法梯,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我犀概,道長(zhǎng)立哑,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任姻灶,我火速辦了婚禮铛绰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘产喉。我一直安慰自己捂掰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布曾沈。 她就那樣靜靜地躺著这嚣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪塞俱。 梳的紋絲不亂的頭發(fā)上姐帚,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音障涯,去河邊找鬼罐旗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛唯蝶,可吹牛的內(nèi)容都是我干的九秀。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼粘我,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鼓蜒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起涂滴,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤友酱,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后柔纵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體缔杉,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年搁料,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了或详。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片系羞。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖霸琴,靈堂內(nèi)的尸體忽然破棺而出椒振,到底是詐尸還是另有隱情,我是刑警寧澤梧乘,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布澎迎,位于F島的核電站,受9級(jí)特大地震影響选调,放射性物質(zhì)發(fā)生泄漏夹供。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一仁堪、第九天 我趴在偏房一處隱蔽的房頂上張望哮洽。 院中可真熱鬧,春花似錦弦聂、人聲如沸鸟辅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)匪凉。三九已至,卻和暖如春徙融,著一層夾襖步出監(jiān)牢的瞬間洒缀,已是汗流浹背瑰谜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工欺冀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人萨脑。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓隐轩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親渤早。 傳聞我的和親對(duì)象是個(gè)殘疾皇子职车,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 因?yàn)橐Y(jié)局swift3.0中引用snapKit的問(wèn)題,看到一篇介紹Xcode8,swift3變化的文章,覺(jué)得很詳細(xì)...
    uniapp閱讀 4,391評(píng)論 0 12
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件鹊杖、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評(píng)論 4 62
  • 爸爸氣哭了媽媽?zhuān)?媽媽眼淚如雨下悴灵。 “要不是掛念女兒, 我才不回這個(gè)家”骂蓖。 媽媽的淚水积瞒, 爸爸的粗話(huà), 沖垮家的土...
    元?dú)馍倥產(chǎn)閱讀 244評(píng)論 8 11
  • 昨天我哭了好幾次登下,也開(kāi)心笑了好幾回茫孔。一天之內(nèi)哭哭笑笑組成我生活的日常叮喳。三毛說(shuō):對(duì)疼痛敏感的人就是對(duì)生活敏感的人。我...
    燕紀(jì)事閱讀 339評(píng)論 0 2