コレクションビューのセルを別のセクションの最後のセルを超えて移動しても機能しません

タコス

コレクションビューでセルを移動/パンできるようにするには、UIGestureRecognizerを実装する必要があります。これは、単一セクションのコレクションビューで正常に機能します。ただし、複数セクションのコレクションビューでは、セルが別のセクションの最後のセルを超えてパン/移動されるとエラーが発生します。「cellForItemAtIndexPath」は、パン中に「新しい」セルを表示するように正しくトリガーされますが、最後に使用可能なセルを超えてパンした後にトリガーしないでください(つまり、その状況ではindexPath.row == numberOfItemsInSectionであり、エラーが発生します(以下のコードを参照))。 。

テーブルビューでは、この問題は(デフォルトの)移動/パンの実装では発生しません。

これはSwiftのバグである可能性があり、セクションの最後のセルを超えてパンしているときに「cellForItemAtIndexPath」のトリガーを回避するための提案はありますか?

以下は、問題を説明するためのSwift2.3の実用的なコード例です。

class CustomViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {

    private var list = ["one", "two", "three","four","five","six","seven","eight"]
    private var itemsList: [[String]]!

    private var collectionView : UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()

        itemsList = [list, list, list] // Create three sections

        collectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: UICollectionViewFlowLayout())
        self.collectionView.dataSource = self
        self.collectionView.delegate = self
        self.collectionView.translatesAutoresizingMaskIntoConstraints = false
        self.collectionView.registerClass(CustomCell.self, forCellWithReuseIdentifier: "cell")

        let panGesture = UIPanGestureRecognizer(target: self, action: #selector(CustomViewController.handleGesture(_:)))
        self.collectionView.addGestureRecognizer(panGesture)
        self.view.addSubview(self.collectionView)
    }

    override func viewWillLayoutSubviews() {
        let margins = view.layoutMarginsGuide
        self.collectionView.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor, constant: 0).active = true
        self.collectionView.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor, constant: 0).active = true
        self.collectionView.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor, constant: 0).active = true
        self.collectionView.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 0).active = true
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
    }

    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int   {
        return itemsList.count
    }

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
         return itemsList[section].count
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CustomCell

        let items = itemsList[indexPath.section]

        cell.label.text = items[indexPath.row] // The error occurs here, after panning beyond the last cell of another section stating: "fatal error: Index out of range"
        return cell
    }

    func collectionView(collectionView: UICollectionView, canMoveItemAtIndexPath indexPath: NSIndexPath) -> Bool {
        return true
    }

    func collectionView(collectionView: UICollectionView, moveItemAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {
        let itemToMove = itemsList[sourceIndexPath.section][sourceIndexPath.row]
        itemsList[sourceIndexPath.section].removeAtIndex(sourceIndexPath.row)
        itemsList[destinationIndexPath.section].insert(itemToMove, atIndex: destinationIndexPath.row)
    }


    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
                  return CGSizeMake(collectionView.bounds.size.width, 50)
    }

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
        return CGSizeMake(collectionView.bounds.size.width, 40)
    }

    func handleGesture(gesture: UIPanGestureRecognizer) {
        switch(gesture.state) {
        case UIGestureRecognizerState.Began:

            guard let selectedIndexPath = self.collectionView.indexPathForItemAtPoint(gesture.locationInView(self.collectionView)) else {
                break }
            collectionView.beginInteractiveMovementForItemAtIndexPath(selectedIndexPath)
        case UIGestureRecognizerState.Changed:
            collectionView.updateInteractiveMovementTargetPosition(gesture.locationInView(gesture.view!))
        case UIGestureRecognizerState.Ended:
            collectionView.endInteractiveMovement()
        default:
            collectionView.cancelInteractiveMovement()
        }
    }
}


class CustomCell: UICollectionViewCell {
    var label: UILabel!
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = UIColor.whiteColor()
        self.label = UILabel()
        self.label.translatesAutoresizingMaskIntoConstraints = false
        self.contentView.addSubview(self.label)
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        let margins = self.contentView.layoutMarginsGuide
        self.label.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor).active = true
        self.label.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor).active = true
        self.label.centerYAnchor.constraintEqualToAnchor(self.contentView.centerYAnchor).active = true
    }
}
タコス

Appleによると、私の質問で説明されている問題はiOSのバグであり、iOS 10ベータ版(xcode 8 GM)の現在のリリースで解決されたようです。

残念ながら、アイテムを空のセクションに移動するための基本的なサポートなど、コレクションビューに関するその他の問題はまだ修正されていません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

セルの選択を解除すると、コレクションビューのdidDeselectItemAtIndexPathが起動しません

分類Dev

UICollectionView:中央のセルへのScrollToItemは、水平コレクションビューでは機能しません

分類Dev

前のセルで何らかのアクションを実行して次のセルに移動すると、コレクションビューセルのラベルが更新されます

分類Dev

uitableviewcell内のコレクションビューセルの画像は丸みを帯びていません

分類Dev

カルーセルアイテムを別のクラスに移動しても機能しません[React]

分類Dev

コレクションビューで中央のセルを見つけて、その内容を変更します

分類Dev

2つのコレクションビュー、1つはセルを表示しません

分類Dev

リフレクションを使用して、別のアセンブリのページに移動します

分類Dev

こんにちは、私はswiftを使用しており、コレクションビューセルが選択されているときにコレクションビューセルのラベルを変更しようとしています

分類Dev

コレクションビューのセルを並べ替えることはできません

分類Dev

ベクトルを超えてもセグメンテーション違反は発生しません

分類Dev

Swift-コレクションビューをスクロールすると、ラベルがセルの左上に移動します

分類Dev

このバージョンは、コレクションビューのセルコンテンツビューをサポートしていません。Xcode11.0以上でこのドキュメントを開く

分類Dev

このバージョンは、コレクションビューのセルコンテンツビューをサポートしていません。Xcode11.0以上でこのドキュメントを開く

分類Dev

テーブルビューの新しいセクションにセルを移動する

分類Dev

Bootstrapを使用して下部のカルーセルキャプションとナビゲーションを移動できません

分類Dev

アンカーはコレクションビューのセルレイアウトでは機能しません

分類Dev

コレクションビューセルの動的な幅と高さを設定します

分類Dev

こんにちは私はコレクションビューセルを使用しています。「真にした」クリックされたセルの数を記録して、次のビューコントローラに戻りたいです。

分類Dev

Segueを介してコレクションビューのセルテキストを送信する方法

分類Dev

メニュー項目をクリックしても、ページのセクションまでスクロールダウンしません

分類Dev

CollectionViewCellを別のセクションに移動します

分類Dev

シングル スクロールでページ全体を表示して次のセクションに移動

分類Dev

ボタンを押してコレクションビューセルの高さを上げ、一番下までスクロールします

分類Dev

コレクションビューの動的高さセル

分類Dev

配列内のセクションに移動し、次のセクションをエコーします

分類Dev

ララベルのフラッシュセッションでHTMLタグを渡す方法は?以下のコードは機能していません

分類Dev

コレクションビューの中心に最も近いコレクションビューセルを検出する

分類Dev

コレクションビューで一度に1つのセルをスクロールします

Related 関連記事

  1. 1

    セルの選択を解除すると、コレクションビューのdidDeselectItemAtIndexPathが起動しません

  2. 2

    UICollectionView:中央のセルへのScrollToItemは、水平コレクションビューでは機能しません

  3. 3

    前のセルで何らかのアクションを実行して次のセルに移動すると、コレクションビューセルのラベルが更新されます

  4. 4

    uitableviewcell内のコレクションビューセルの画像は丸みを帯びていません

  5. 5

    カルーセルアイテムを別のクラスに移動しても機能しません[React]

  6. 6

    コレクションビューで中央のセルを見つけて、その内容を変更します

  7. 7

    2つのコレクションビュー、1つはセルを表示しません

  8. 8

    リフレクションを使用して、別のアセンブリのページに移動します

  9. 9

    こんにちは、私はswiftを使用しており、コレクションビューセルが選択されているときにコレクションビューセルのラベルを変更しようとしています

  10. 10

    コレクションビューのセルを並べ替えることはできません

  11. 11

    ベクトルを超えてもセグメンテーション違反は発生しません

  12. 12

    Swift-コレクションビューをスクロールすると、ラベルがセルの左上に移動します

  13. 13

    このバージョンは、コレクションビューのセルコンテンツビューをサポートしていません。Xcode11.0以上でこのドキュメントを開く

  14. 14

    このバージョンは、コレクションビューのセルコンテンツビューをサポートしていません。Xcode11.0以上でこのドキュメントを開く

  15. 15

    テーブルビューの新しいセクションにセルを移動する

  16. 16

    Bootstrapを使用して下部のカルーセルキャプションとナビゲーションを移動できません

  17. 17

    アンカーはコレクションビューのセルレイアウトでは機能しません

  18. 18

    コレクションビューセルの動的な幅と高さを設定します

  19. 19

    こんにちは私はコレクションビューセルを使用しています。「真にした」クリックされたセルの数を記録して、次のビューコントローラに戻りたいです。

  20. 20

    Segueを介してコレクションビューのセルテキストを送信する方法

  21. 21

    メニュー項目をクリックしても、ページのセクションまでスクロールダウンしません

  22. 22

    CollectionViewCellを別のセクションに移動します

  23. 23

    シングル スクロールでページ全体を表示して次のセクションに移動

  24. 24

    ボタンを押してコレクションビューセルの高さを上げ、一番下までスクロールします

  25. 25

    コレクションビューの動的高さセル

  26. 26

    配列内のセクションに移動し、次のセクションをエコーします

  27. 27

    ララベルのフラッシュセッションでHTMLタグを渡す方法は?以下のコードは機能していません

  28. 28

    コレクションビューの中心に最も近いコレクションビューセルを検出する

  29. 29

    コレクションビューで一度に1つのセルをスクロールします

ホットタグ

アーカイブ