Здравствуйте, читатели, почти все мы, возможно, работали над демо каруселью или реальными вариантами использования на своем карьерном пути. Что ж, мы столкнулись с такими требованиями, как представление карусели изображений, представление динамической коллекции для галереи изображений и работа с анимацией для представления карусели с автоматической прокруткой. Сегодня мы собираемся изучить что-то похожее на описанные выше сценарии. Мы будем разрабатывать демонстрационное приложение, которое будет генерировать простое карусельное представление изображений с бесконечной прокруткой/циклом, используя UICollectionView и UIPageControl. Будет проще, так что давайте углубимся.
Давайте сделаем это с кодом и пояснениями.
Сначала создайте простое представление коллекции изображений.
import UIKit
import Foundation
class MainVC: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource{
//MARK: - OUTLETS
@IBOutlet weak var colVw: UICollectionView!
//MARK: - GLOBAL VARIABLES
var imageArray = ["place_canada","place_costa_rica","place_germany","place_greece","place_india"] //add your sample images
//MARK: - DELEGATE METHODS
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return imageArray.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! DetailCollectionViewCell
cell.imgView.image = UIImage(named: imageArray[indexPath.row])
return cell
}
}
Запустив приведенный выше код, вы заметите, что размер ячейки изображения немного неравномерен, прежде чем двигаться дальше, давайте это исправим.
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
CGSize(width: UIScreen.main.bounds.width, height: 250)
}
Метод делегата установит CGSize ячейки, но мы должны внести некоторые изменения в раскадровку. Выберите представление коллекции, откройте инспектор размеров на правой панели и измените предполагаемый размер представления коллекции на «Нет». Теперь повторно запустите код. Мы должны исправить неровные ячейки. Hi-Fi
Двигаясь дальше, добавьте UIPageControl в раскадровку, указав соответствующие ограничения, и привяжите его к быстрому файлу. Для настройки номера страницы и управления страницей мы будем кодировать методы делегата представления прокрутки: scrollViewDidEndDecelerating и scrollViewDidEndDragging соответственно.
//MARK: - GLOBAL VARIABLES
var frame = CGFloat(0)
//MARK: - UI VIEW CONTROLLER LIFE CYCLES
override func viewDidLoad() {
super.viewDidLoad()
pageControl.numberOfPages = imageArray.count
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let pageNumber = scrollView.contentOffset.x/scrollView.frame.size.width
pageControl.currentPage = Int(pageNumber)
if pageControl.currentPage == 1{
frame = pageNumber
}
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if pageControl.currentPage == imageArray.count - 1{
pageControl.currentPage = 0
colVw.contentOffset = CGPoint(x: 0, y: 0)
}
}
Весь код должен выглядеть так:
import UIKit
import Foundation
class MainVC: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UIScrollViewDelegate{
//MARK: - OUTLETS
@IBOutlet weak var colVw: UICollectionView!
@IBOutlet weak var pageControl: UIPageControl!
//MARK: - GLOBAL VARIABLES
var imageArray = ["place_canada","place_costa_rica","place_germany","place_greece","place_india"]
var frame = CGFloat(0)
//MARK: - UI VIEW CONTROLLER LIFE CYCLES
override func viewDidLoad() {
super.viewDidLoad()
pageControl.numberOfPages = imageArray.count
}
//MARK: - DELEGATE METHODS
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return imageArray.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! DetailCollectionViewCell
cell.imgView.image = UIImage(named: imageArray[indexPath.row])
return cell
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
CGSize(width: UIScreen.main.bounds.width, height: 250)
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let pageNumber = scrollView.contentOffset.x/scrollView.frame.size.width
pageControl.currentPage = Int(pageNumber)
if pageControl.currentPage == 1{
frame = pageNumber
}
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if pageControl.currentPage == imageArray.count - 1{
pageControl.currentPage = 0
colVw.contentOffset = CGPoint(x: 0, y: 0)
}
}
}
Вот и все, дайте вашей демонстрации последний запуск.
Учитывая, что существует множество требований к коду и манипуляций, которые можно выполнить с помощью представления коллекции, здесь мы попытались достичь одного из них.
Проверьте GitHub Repo для примера проекта. Удачного кодирования!
Большое спасибо за чтение. Я надеюсь, что у вас есть лучшее представление об этой теме, и вам было так же весело читать это, как и мне писать. С дополнительными вопросами и запросами обращайтесь по адресу [email protected].