Как центрировать ячейку представления коллекции, когда пользователь проводит пальцем, но недостаточно для отображения другой ячейки - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь воссоздать приложение галереи iOS, где у пользователя есть два контроллера представления коллекции: первый показывает все доступные изображения, а второй отображается, когда пользователь нажимает на изображение (ячейку) и тот жеизображение отображается в другом контроллере представления коллекции со следующей функцией:

DispatchQueue.main.async {
        self.collectionView?.scrollToItem(at: self.customIndexPath, at: UICollectionView.ScrollPosition.centeredHorizontally, animated: false)
    }
}

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

Проблема в том, что во втором контроллере представления коллекции (где изображение отображается отдельно), я не знаю, как сделать так, чтобы, когда пользователь проводит пальцем вправо или влево, показывается следующее / предыдущее изображениеи по центру, как если бы вышеупомянутая функция была вызвана на этом изображении.

Я пытался вызвать вышеуказанную функцию в следующем коде

        func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {

    let newIndexPath = IndexPath(item: indexPath.item, section: 0)
    print("Item at \(indexPath.item)")
    self.collectionView?.scrollToItem(at: newIndexPath, at: UICollectionView.ScrollPosition.centeredHorizontally, animated: true)
}

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

import UIKit

class ViewController: UIViewController {


@IBOutlet weak var collectionView: UICollectionView!

var customIndexPath = IndexPath()

let images:[UIImage] = [

    UIImage(named: "image_1")!,
    UIImage(named: "image_2")!,
    UIImage(named: "image_3")!,
    UIImage(named: "image_4")!,
    UIImage(named: "image_5")!,
    UIImage(named: "image_6")!,
    UIImage(named: "image_7")!,
    UIImage(named: "image_8")!,


]

override func viewDidLoad() {
    super.viewDidLoad()
    collectionView.delegate = self
    // Do any additional setup after loading the view, typically from a nib.
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print(customIndexPath)
    DispatchQueue.main.async {
        self.collectionView?.scrollToItem(at: self.customIndexPath, at: UICollectionView.ScrollPosition.centeredHorizontally, animated: false)
    }
}


}


extension ViewController: UICollectionViewDataSource, UICollectionViewDelegate {


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    return images.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell
    cell.userImageView.image = images[indexPath.item]
    return cell
}

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {

    let newIndexPath = IndexPath(item: indexPath.item, section: 0)
    print("Item at \(indexPath.item)")
    self.collectionView?.scrollToItem(at: newIndexPath, at: UICollectionView.ScrollPosition.centeredHorizontally, animated: true)
}





}

Результат должен быть очень похож на приложение iOS Gallery на самом базовом уровне, когда пользователь проводит пальцем, следующее изображение должно отображаться и центрироваться, а неплавающая как сейчас или показанная частично, также, если пользователь медленно проводит пальцем, а следующая ячейка (следующее изображение) не отображается по крайней мере на половине ее содержимого, то представление коллекции должно отображать и центрировать предыдущее изображение, так же, какiOS Gallery App

Мой проект до сих пор можно найти по следующей ссылке:

https://github.com/francisc112/Gallery-Test

Заранее спасибо, если есть какое-либо руководство, где я могу научиться делать это, пожалуйста, укажите это.

1 Ответ

0 голосов
/ 04 февраля 2019

Я только что попытался решить эту проблему, используя немного другой подход.Я использую только методы scrollViewWillEndDragging и scrollViewDidEndDragging.Также я использую свойство previousCollectionViewContentOffsetX, которое используется, чтобы сказать, следует ли нам прокручивать к следующей или предыдущей ячейке, когда заканчивается перетаскивание, если пользователь выполняет быструю прокрутку (это поведение PhotosApp).

Наконеця только что установил высокую скорость замедления для эмуляции функции нумерации страниц:

collectionView.decelerationRate = .fast

Вы можете увидеть это решение в запросе на выгрузку, который я только что сделал в вашем репо.

Другое более простое решение - установить минимальный интервал collectionView для ячеек и линий на ноль и включить нумерацию collectionView.Мы теряем поля между фотографиями, отображаемыми приложением PhotosApp, но стараемся не касаться делегатов с прокруткой.Я могу сделать запрос на извлечение с этим решением, если хотите.

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