ios uiview uiscrollview uilabel

ios - mis problemas iniciales con UIScrollView ahora parecen estar relacionados con el autodiseño



uiview uilabel (1)

Para mi primer desafío al usar UIScrollView modifiqué este ejemplo para hacer que UIScrollView muestre no solo otro color de fondo sino también otro UIView y UILabel en cada página. Pero podría haber elegido fácilmente para mostrar objetos como UITableView , UIButton o UIImage .

Potencialmente, UIScrollView podría ser mucho más que una vista de contenido gigante donde los usuarios se desplazan de una parte a la siguiente, por ejemplo, algunas páginas pueden tener un UIButton que lleva a un usuario a una página específica, de la misma manera que usamos los libros.

Mejoras de código

Mi pregunta ha evolucionado desde que la publiqué por primera vez. Inicialmente, las etiquetas se acumularon en la página 1 (como se muestra a continuación ), pero esto ya se ha corregido. También incluí esta extensión para agrandar la fuente.

Mejoramiento adicional ?

A medida que el código evolucionó me volví más consciente de otros problemas, por ejemplo, las imágenes de iPhone 5 (a continuación ) aparecen de forma diferente en el iPhone 7 donde UILabel está centrado, pero no en UIView . Así que mi próximo desafío es posiblemente aprender a combinar UIScrollView con Autolayout. Invito a cualquiera a descubrir otras cosas que podrían estar equivocadas.

ViewController.swift (corregido)

import UIKit class ViewController: UIViewController,UIScrollViewDelegate { let scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: 320, height: 480)) var views = [UIView]() var lables = [UILabel]() var colors:[UIColor] = [UIColor.red, UIColor.magenta, UIColor.blue, UIColor.cyan, UIColor.green, UIColor.yellow] var frame: CGRect = CGRect.zero var pageControl: UIPageControl = UIPageControl(frame: CGRect(x: 50, y: 500, width: 200, height: 50)) override func viewDidLoad() { super.viewDidLoad() initialiseViewsAndLables() configurePageControl() scrollView.delegate = self self.view.addSubview(scrollView) for index in 0..<colors.count { frame.origin.x = self.scrollView.frame.size.width * CGFloat(index) frame.size = self.scrollView.frame.size self.scrollView.isPagingEnabled = true views[index].frame = frame views[index].backgroundColor = colors[Int(index)] views[index].layer.cornerRadius = 20 views[index].layer.masksToBounds = true lables[index].frame = frame lables[index].center = CGPoint(x: (view.frame.midX + frame.origin.x), y: view.frame.midY) lables[index].text = String(index + 1) lables[index].defaultFont = UIFont(name: "HelveticaNeue", size: CGFloat(200)) lables[index].textAlignment = .center lables[index].textColor = .black let subView1 = views[index] let subView2 = lables[index] self.scrollView .addSubview(subView1) self.scrollView .addSubview(subView2) } print(views, lables) self.scrollView.contentSize = CGSize(width: self.scrollView.frame.size.width * CGFloat(colors.count), height: self.scrollView.frame.size.height) pageControl.addTarget(self, action: Selector(("changePage:")), for: UIControlEvents.valueChanged) } func initialiseViewsAndLables() { // Size of views[] and lables[] is linked to available colors for index in 0..<colors.count { views.insert(UIView(), at:index) lables.insert(UILabel(), at: index) } } func configurePageControl() { // Total number of available pages is based on available colors self.pageControl.numberOfPages = colors.count self.pageControl.currentPage = 0 self.pageControl.backgroundColor = getColour() self.pageControl.pageIndicatorTintColor = UIColor.black self.pageControl.currentPageIndicatorTintColor = UIColor.green self.view.addSubview(pageControl) } func getColour() -> UIColor { let index = colors[pageControl.currentPage] return (index) } func changePage(sender: AnyObject) -> () { scrollView.setContentOffset(CGPoint(x: CGFloat(pageControl.currentPage) * scrollView.frame.size.width, y: 0), animated: true) } func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width) pageControl.currentPage = Int(pageNumber) pageControl.backgroundColor = getColour() } }

Extensión

extension UILabel{ var defaultFont: UIFont? { get { return self.font } set { self.font = newValue } } }


El punto central de la etiqueta en cada cuadro debe estar compensado por el origen de la vista de contenido ( como señaló Baglan ). He modificado la siguiente línea de código en consecuencia.

lables[Int(index)].center = CGPoint(x: (view.frame.midX + frame.origin.x), y: view.frame.midY)