ios - stretchy - uiscrollview example



мои первоначальные проблемы с UIScrollView теперь, похоже, связаны с автозапуском (1)

Для моей первой задачи с использованием UIScrollView я изменил этот пример, чтобы отобразить UIScrollView не только другой фоновый цвет, но и другой UIView и UILabel на каждой странице. Но я мог бы так же легко выбрать для отображения таких объектов, как UITableView , UIButton или UIImage .

Потенциально, UIScrollView может быть гораздо больше, чем гигантский контент-просмотр, где пользователи переходят от одной части к другой, например, некоторые страницы могут иметь UIButton который выводит пользователя на определенную страницу, так же, как мы используем книги.

Улучшение кода

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

Дальнейшее улучшение?

По мере развития кода я стал более осведомлен о других проблемах, например, изображения iPhone 5 ( см. Ниже ) выглядят по-разному на iPhone 7, где UILabel сосредоточен, но не UIView . Поэтому моя следующая задача - узнать, как объединить UIScrollView с Autolayout. Я приглашаю кого-нибудь обнаружить другие вещи, которые могут быть неправильными.

ViewController.swift (исправлено)

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()
    }
}

расширение

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

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

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