Я пытаюсь воссоздать приложение галереи 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
Заранее спасибо, если есть какое-либо руководство, где я могу научиться делать это, пожалуйста, укажите это.