Swift-UICollectionviewでのスクロール中に画像の変更を停止する方法は?

Duc Phan

collectionviewダウンロードしたURLで識別された画像を表示するために使用しています。これは私のコードです:

var urlArray = ["url1", "url2", ..., "urln"]

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
       let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "myCell, for: indexPath) as? MyCell
       cell.objectImageView.downloadedFrom(link: urlArray[indexPath.row], contentMode: UIViewContentMode.scaleAspectFit)
}

これは、画像を非同期でダウンロードする私の拡張コードです。

func downloadedFrom(url: URL, contentMode mode: UIViewContentMode = .scaleAspectFit) {
    contentMode = mode
    URLSession.shared.dataTask(with: url) { data, response, error in
        guard
            let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
            let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
            let data = data, error == nil,
            let image = UIImage(data: data)
            else { return }
        DispatchQueue.main.async() {
            self.image = image
        }
        }.resume()
}

func downloadedFrom(link: String, contentMode mode: UIViewContentMode = .scaleAspectFit) {
    guard let url = URL(string: link) else { return }
    downloadedFrom(url: url, contentMode: mode)
}

collectionview画像をスクロールすると、各セルの画像が連続的に変化しています。メソッドにロードimageviewするnil前に設定して修正しようとしましたcellForItemAt

cell.objectImageView.image = nil
cell.objectImageView.downloadedFrom(link: urlArray[indexPath.row], contentMode: UIViewContentMode.scaleAspectFit)

しかし、それは機能しません。この問題を解決するにはどうすればよいですか?

staticVoidMan

設定nilは完全には役に立ちません。これは主にセルの再利用の問題です。

イメージのダウンロードは非同期です。つまり、後で完了します。画像のダウンロードが完了する前に
スクロールしてacellを再利用すると、前のダウンロード呼び出しの画像が設定されるため、継続的な変更が発生し、間違いなくグリッチが発生します。

完了したダウンロードタスクが、imageViewまたは再利用されたものであるかどうかを基本的に把握するには、これを追跡するための追加情報が必要になります。その場合、別のダウンロードタスクがそれを設定します。

これはさまざまな方法で実行できますが、以下では、ダウンロードの開始時のURLがダウンロードの完了時のURLと同じであるかどうかを確認します。

次のような単純なもの:

func downloadedFrom(url: URL, contentMode mode: UIViewContentMode = .scaleAspectFit) {
    /*
     1.
     strUniqueIdentifier_Initial will be the url that caused the download to start.
     A copy of this will be accessible in the closure later.

     Also, we bind this to the imageView for case handling in the closure.
     */
    let strUniqueIdentifier_Initial = url.absoluteString
    self.accessibilityLabel = strUniqueIdentifier_Initial

    contentMode = mode
    let dataTask = URLSession.shared.dataTask(with: url) { data, response, error in
        guard
            let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
            let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
            let data = data, error == nil,
            let image = UIImage(data: data)
            else { return }

        /*
         2.
         strUniqueIdentifier_Initial is a copy of the url from the start of the function

         strUniqueIdentifier_Current is the url of the current imageView as we use self
          so if the imageView is reused, this method will be called on it again and at
          that time it it's binded url string will be for the latest download call

         If there's mismatch then the imageView was reused
         */
        let strUniqueIdentifier_Current = self.accessibilityLabel
        if strUniqueIdentifier_Initial != strUniqueIdentifier_Current {
            //previous download task so ignore
            return
        }

        DispatchQueue.main.async() {
            self.image = image
        }
    }
    dataTask.resume()
}

ロジックを最適化して以前のダウンロードをキャンセルすることができますが、これはコアの問題に対する基本的な解決策です。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Xcode / Swiftのスクロールビューで複数の画像を中央揃えにする方法

分類Dev

Swiftで画像のサイズを変更する方法は?

分類Dev

Swift collectionViewの中央のセルを取得し、スクロール時にサイズを変更するにはどうすればよいですか?

分類Dev

変更した画像をSwift3のカメラロールに保存する

分類Dev

チェックボックスの画像を変更するには、Swiftテーブルビューセルを選択します

分類Dev

Forループを使用してSwiftの画像プロパティを変更する

分類Dev

Forループを使用してSwiftの画像プロパティを変更する

分類Dev

Swift 4UICollectionViewはスクロールの終了を検出します

分類Dev

SwiftでUICollectionViewの新しいセルを下からロードする方法

分類Dev

Swiftスタックビュー内の画像のサイズを変更する方法

分類Dev

SWIFTでViewControllerを変更した後、コレクションビューのスクロール位置を保持する方法

分類Dev

SwiftでスライダーをスクロールしてUICollectionViewをスクロールするにはどうすればよいですか?

分類Dev

Swift3.0でUICollectionViewのセルを中央揃えにする方法は?

分類Dev

Swiftのスクロール中にUICollectionViewレイヤーが移動/静的にならないように設定する方法

分類Dev

tableviewcellに画像を設定すると、Swiftでのスクロールが遅くなります

分類Dev

Swift: UICollectionView スクロール時のラベルと画像のセルの複製

分類Dev

SwiftコードでNSButtonの画像を変更する

分類Dev

Swiftでセグメント化されたコントロールの背景画像を変更する

分類Dev

グローバル変数を使用せずに、複数のswiftクラスで大きな変更されていない配列を再利用する

分類Dev

UICollectionView再利用可能セル用のSDWebImageを使用してパスから画像をロードする-Swift

分類Dev

Swiftで変数のクラスをテストする方法は?

分類Dev

IOS swift4のforループ中にラベルテキストを変更するにはどうすればよいですか?

分類Dev

スクロール時にコレクションビューで位置を変更するSwift 3つの選択されたボタン

分類Dev

グローバル変数の画像名を変更します-swift

分類Dev

Swiftでフレームのサイズを変更する広告バナーを停止する方法

分類Dev

SwiftのUITableViewControllerのUIImageViewで画像サイズの変更を回避する方法

分類Dev

SwiftのUISliderを使用してUIImageViewの画像を変更する方法

分類Dev

SwiftのCATextLayerでテキストの色を変更する方法

分類Dev

IOS Swiftは、TableView内の画像のスペースを非表示にする方法

Related 関連記事

  1. 1

    Xcode / Swiftのスクロールビューで複数の画像を中央揃えにする方法

  2. 2

    Swiftで画像のサイズを変更する方法は?

  3. 3

    Swift collectionViewの中央のセルを取得し、スクロール時にサイズを変更するにはどうすればよいですか?

  4. 4

    変更した画像をSwift3のカメラロールに保存する

  5. 5

    チェックボックスの画像を変更するには、Swiftテーブルビューセルを選択します

  6. 6

    Forループを使用してSwiftの画像プロパティを変更する

  7. 7

    Forループを使用してSwiftの画像プロパティを変更する

  8. 8

    Swift 4UICollectionViewはスクロールの終了を検出します

  9. 9

    SwiftでUICollectionViewの新しいセルを下からロードする方法

  10. 10

    Swiftスタックビュー内の画像のサイズを変更する方法

  11. 11

    SWIFTでViewControllerを変更した後、コレクションビューのスクロール位置を保持する方法

  12. 12

    SwiftでスライダーをスクロールしてUICollectionViewをスクロールするにはどうすればよいですか?

  13. 13

    Swift3.0でUICollectionViewのセルを中央揃えにする方法は?

  14. 14

    Swiftのスクロール中にUICollectionViewレイヤーが移動/静的にならないように設定する方法

  15. 15

    tableviewcellに画像を設定すると、Swiftでのスクロールが遅くなります

  16. 16

    Swift: UICollectionView スクロール時のラベルと画像のセルの複製

  17. 17

    SwiftコードでNSButtonの画像を変更する

  18. 18

    Swiftでセグメント化されたコントロールの背景画像を変更する

  19. 19

    グローバル変数を使用せずに、複数のswiftクラスで大きな変更されていない配列を再利用する

  20. 20

    UICollectionView再利用可能セル用のSDWebImageを使用してパスから画像をロードする-Swift

  21. 21

    Swiftで変数のクラスをテストする方法は?

  22. 22

    IOS swift4のforループ中にラベルテキストを変更するにはどうすればよいですか?

  23. 23

    スクロール時にコレクションビューで位置を変更するSwift 3つの選択されたボタン

  24. 24

    グローバル変数の画像名を変更します-swift

  25. 25

    Swiftでフレームのサイズを変更する広告バナーを停止する方法

  26. 26

    SwiftのUITableViewControllerのUIImageViewで画像サイズの変更を回避する方法

  27. 27

    SwiftのUISliderを使用してUIImageViewの画像を変更する方法

  28. 28

    SwiftのCATextLayerでテキストの色を変更する方法

  29. 29

    IOS Swiftは、TableView内の画像のスペースを非表示にする方法

ホットタグ

アーカイブ