Масштаб ячейки представления коллекции не сбрасывается - PullRequest
0 голосов
/ 12 июня 2019

У меня есть контроллер представления с представлением коллекции, который выглядит следующим образом:

import UIKit

private let reuseIdentifier = "LightboxCollectionViewCell"

class LightboxViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    var items: [Image]?

    @IBOutlet weak var collectionView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.collectionView.delegate = self
        self.collectionView.dataSource = self

        let collectionViewCell = UINib(nibName: reuseIdentifier, bundle: nil)
        self.collectionView.register(collectionViewCell, forCellWithReuseIdentifier: reuseIdentifier)
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return items!.count
    }

    func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
        guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as? LightboxCollectionViewCell else {
            fatalError(String(format: "The dequeued cell is not an instance of %s.", reuseIdentifier))
        }

        // Reset the zoom
        cell.imageView.transform = CGAffineTransform.identity
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as? LightboxCollectionViewCell else {
            fatalError(String(format: "The dequeued cell is not an instance of %s.", reuseIdentifier))
        }

        if let item = items?[indexPath.row] {
            cell.initialize(media: item)
        }

        return cell
    }

}

А вот класс ячеек:

import UIKit
import Kingfisher

class LightboxCollectionViewCell: UICollectionViewCell {

    var media: Image?

    // Sets the maximum zoom
    let maxZoom: CGFloat = 10

    @IBOutlet weak var background: UIView!
    @IBOutlet weak var imageView: UIImageView!

    func initialize(media: PostImage) {
        self.media = media

        if let thumbnailUrl = media.thumbnailUrl {
            imageView.kf.setImage(with: URL(string: thumbnailUrl))
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()

        // Create pinch gesture recognizer to handle zooming
        let pinch = UIPinchGestureRecognizer(target: self, action: #selector(self.pinchToZoom(sender:)))
        self.imageView.addGestureRecognizer(pinch)
    }

    /**
     Handles pinch zooming.
     */
    @objc func pinchToZoom(sender: UIPinchGestureRecognizer) {
        if sender.state == .began || sender.state == .changed {
            let currentScale = self.imageView.frame.size.width / self.imageView.bounds.size.width
            var newScale = currentScale * sender.scale

            if newScale < 1 {
                newScale = 1
            }

            if newScale > maxZoom {
                newScale = maxZoom
            }

            let transform = CGAffineTransform(scaleX: newScale, y: newScale)

            self.imageView.transform = transform
            sender.scale = 1
        }
    }

}

Как вы можете видеть, в didEndDisplaying, Я пытаюсь сбросить масштаб изображения, отображаемого в ячейке, потому что у меня есть функция, которая позволяет пользователю увеличивать изображение.Но по какой-то причине зум не сбрасывается, и я понятия не имею, почему.

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Вы удаляете новую ячейку из очереди (которая относится только к cellForItemAt) вместо использования предоставленной.Измените свой код на следующий, и вы должны быть в порядке:

func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    guard let cell = cell as? LightboxCollectionViewCell else {
        fatalError("The cell is not an instance of \(reuseIdentifier).")
    }

    // Reset the zoom
    cell.imageView.transform = CGAffineTransform.identity
}
0 голосов
/ 12 июня 2019

Вместо использования функции didEndDisplaying вы можете установить значения преобразования изображения в качестве идентификатора в prepareForReuse ячейки.

В файле LightboxCollectionViewCell просто добавьте эту функцию

 override func prepareForReuse() {
    super.prepareForReuse()
    self.imageView.transform = CGAffineTransform.identity
 }

и удалите функцию didEndDisplaying из LightboxViewController.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...