with page example control ios swift uicollectionview swift3 uipagecontrol

ios - with - uipagecontrol example



Cómo agregar PageControl dentro de UICollectionView Image Scrolling (7)

Aquí tiene una clase completa con la paginación de Control de página en una vista de colección horizontal. Esto está funcionando en una de mis aplicaciones, ahora mismo, y está funcionando correctamente. Si no puedes hacerlo funcionar, no dudes en preguntarme y te ayudaré.

Primero, en el Guión Gráfico tienes que configurar tu CollectionView con:

Diseño : Flujo
Dirección de desplazamiento : horizontal
Desplazamiento habilitado
Paginación habilitada

@IBOutlet weak var collectionView: UICollectionView! //img: 77 @IBOutlet weak var pageControl: UIPageControl! var thisWidth:CGFloat = 0 override func awakeFromNib() { super.awakeFromNib() thisWidth = CGFloat(self.frame.width) collectionView.delegate = self collectionView.dataSource = self pageControl.hidesForSinglePage = true } func numberOfSections(in collectionView: UICollectionView) -> Int { return 10 } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 1 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "YourCell", for: indexPath) return cell } func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { self.pageControl.currentPage = indexPath.section } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { thisWidth = CGFloat(self.frame.width) return CGSize(width: thisWidth, height: self.frame.height) }

Hola, tengo los códigos de lista de imágenes horizontales de UICollectionView quiero agregar PageControl cuando se PageControl imágenes de desplazamiento, agregué selector de IBOutlet e IBOutlet pero, ¿cómo puedo integrarlo? entre UICollecitonView . ?

Mis códigos debajo de abajo.

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { @IBOutlet weak var View : DesignableView! @IBOutlet var collectionView: UICollectionView! @IBOutlet var collectionViewLayout: UICollectionViewFlowLayout! @IBOutlet open weak var pageControl: UIPageControl? { didSet { pageControl?.addTarget(self, action: #selector(ViewController.pageChanged(_:)), for: .valueChanged) } } override func viewDidLoad() { super.viewDidLoad() pageControl?.numberOfPages = 11 } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 11; } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell: ImageCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCollectionViewCell", for: indexPath) as! ImageCollectionViewCell cell.label.text = "Cell /(indexPath.row)" cell.backgroundImageView.image = UIImage(named: "Parallax /(indexPath.row + 1)") // Parallax cell setup cell.parallaxTheImageViewScrollOffset(self.collectionView.contentOffset, scrollDirection: self.collectionViewLayout.scrollDirection) return cell } @IBAction open func pageChanged(_ sender: UIPageControl) { print(sender.currentPage) } // MARK: Delegate func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return collectionView.bounds.size; } // MARK: Scrolling func scrollViewDidScroll(_ scrollView: UIScrollView) { // Parallax visible cells for cell: ImageCollectionViewCell in collectionView.visibleCells as! [ImageCollectionViewCell] { cell.parallaxTheImageViewScrollOffset(self.collectionView.contentOffset, scrollDirection: self.collectionViewLayout.scrollDirection) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }


En espera de scrollViewDidEndDecelerating resultados en una actualización lenta a UIPageControl . Si desea una IU más receptiva, sugiero que se implemente scrollViewWillEndDragging(_:withVelocity:targetContentOffset:) .

Ejemplo de Swift 4 donde cada sección de vista de colección es una página:

override func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { if let collectionView = scrollView as? ScoreCollectionView, let section = collectionView.indexPathForItem(at: targetContentOffset.pointee)?.section { self.pageControl.currentPage = section } }


No soy un fan de la respuesta aceptada. De vez en cuando, la willDisplay cell devolverá la página incorrecta para el control de la página según la interacción de los usuarios.

Lo que yo uso:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { pageControl.currentPage = Int(scrollView.contentOffset.x) / Int(scrollView.frame.width) }

Esto actualizará la página una vez que el usuario haya terminado de desplazarse, lo que currentPage la página currentPage del currentPage de pageControl más precisa.


Para un UIPageControl más sensible, prefiero usar scrollViewDidScroll y calcular el desplazamiento con respecto al centro horizontal del scrollView.

func scrollViewDidScroll(_ scrollView: UIScrollView) { let offSet = scrollView.contentOffset.x let width = scrollView.frame.width let horizontalCenter = width / 2 pageControl.currentPage = Int(offSet + horizontalCenter) / Int(width) }


Swift 4.2 Muy suave trabajando

//MARK:- For Display the page number in page controll of collection view Cell func scrollViewDidScroll(_ scrollView: UIScrollView) { let visibleRect = CGRect(origin: self.collectionview.contentOffset, size: self.collectionview.bounds.size) let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY) if let visibleIndexPath = self.collectionview.indexPathForItem(at: visiblePoint) { self.pageControl.currentPage = visibleIndexPath.row } }


La respuesta de Luke fue un buen comienzo para mí, pero tenía dos problemas: no se actualizaba con frecuencia (ya se señaló en otras respuestas), pero lo más importante es que no mostraba la página correcta para el último elemento en mi vista de colección (orientada horizontalmente) y solo cambiaba de página cuando el elemento estaba casi saliendo de la pantalla.

Para el primer problema, como otros lo notaron, el uso de scrollViewDidScroll proporcionó una mejor experiencia. Me preocupaban los problemas de rendimiento al hacer la llamada con tanta frecuencia, pero no noté ninguno.

En cuanto al segundo problema, para mi caso de uso, encontrar la ruta de índice de la celda que está en el centro de la pantalla proporcionó una mejor solución. Tenga en cuenta que si su caso de uso puede contener más de dos celdas en la pantalla, es posible que deba ajustarlo. Esto se debe a que su última celda nunca alcanzaría la mitad de la pantalla. Sin embargo, argumentaría que, en ese caso, utilizar UIPageControl podría no ser lo ideal.

func scrollViewDidScroll(_ scrollView: UIScrollView) { let visibleRect = CGRect(origin: self.collectionView.contentOffset, size: self.collectionView.bounds.size) let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY) if let visibleIndexPath = self.collectionView.indexPathForItem(at: visiblePoint) { self.pageControl.currentPage = visibleIndexPath.row } }


func scrollViewDidScroll(_ scrollView: UIScrollView) { let visibleRect = CGRect(origin: self.cvImageListing.contentOffset, size: self.cvImageListing.bounds.size) let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY) if let visibleIndexPath = self.cvImageListing.indexPathForItem(at: visiblePoint) { self.pageControl.currentPage = visibleIndexPath.row } }