//
// PageControlViewController.swift
// PageControlViewProject
//
// Created by 影子传说 on 2018/9/25.
// Copyright © 2018 影子传说. All rights reserved.
//
import UIKit
class PageControlViewController: UIViewController, UIScrollViewDelegate {//添加滚动视图代理协议
//为视图控制器添加一个滚动视图属性
var scrollView = UIScrollView()//滚动视图是一个可以拖动的组件
var pageControl = UIPageControl()//继续添加一个控制翻页的属性,使用它来控制滚动视图的翻页,通过该组件中的小白点,来观察当前页面的位置
var isPageControlUsed = false//添加一个状态属性,用来标志页面的滑动状态
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
var screenFrame = UIScreen.main.bounds//首先获取当前设备的屏幕尺寸信息
//然后获得屏幕尺寸的宽度值和高度值
let screenHeight = screenFrame.size.height
let screenWidth = screenFrame.size.width
scrollView.frame = screenFrame//创建一个区域,来显示之前创建的视图控制器
scrollView.isPagingEnabled = true//设置滚动模式为分页模式,即毎滚动一次就是一页
scrollView.contentSize = CGSize(width: screenWidth * 2, height: screenHeight)//设置滚动视图的尺寸信息,您有两个页面,所以将滚动视图的宽度,设置为两倍页面宽度
scrollView.backgroundColor = UIColor.black//设置滚动试图的背景颜色为黑色
scrollView.delegate = self//设置滚动视图对象的代理为当前类,这样就可以在当前文件中,编写代理方法,以捕捉滚动视图的相关动作
let pcHeight:CGFloat = 50.0//在创建一个高度变量,作为页面控制器对象的高度
let pcRect = CGRect(x: 0, y: screenHeight-pcHeight, width: screenWidth, height: pcHeight)//然后创建一个区域,用来显示页面控制对象
pageControl.frame = pcRect//设置页面控制对象的显示区域
pageControl.numberOfPages = 2//接着设置页面控制器对象的总页数为两页
pageControl.currentPage = 0//设置页面控制器对象的当前页编号
pageControl.backgroundColor = UIColor.gray//继续设置页面控制器对象的背景颜色为灰色
pageControl.addTarget(self, action: #selector(PageControlViewController.pageControlDidChanged(_ :)), for: UIControl.Event.valueChanged)//给页面控制器对象,添加监听页面切换事件的方法
let firstController = FirstSubViewController()//创建第一个试图控制器对象的实例
screenFrame.origin.x = 0//设置坐标原点的横向值为零
firstController.view.frame = screenFrame//设置第一个试图控制器对象的显示区域
let secondController = SecondViewController()//创建第二个视图控制器对象的实例
screenFrame.origin.x = screenFrame.size.width//设置坐标原点的x值为屏幕宽度,即第二个视图控制器对象显示在屏幕之外
secondController.view.frame = screenFrame//设置第二个视图控制器对象的显示区域
scrollView.addSubview(firstController.view)
scrollView.addSubview(secondController.view)//将两个视图控制器的根视图,分别添加到滚动视图对象里
self.view.addSubview(scrollView)
self.view.addSubview(pageControl)//再将滚动视图对象和页面控制器对象,分别添加到当前窗口的根视图里
}
@objc func pageControlDidChanged(_ sender:AnyObject)//创建监听页面切换事件的方法
{
let crtPage = (CGFloat)(pageControl.currentPage)//获得当前页面控制器对象的当前页码,页码从0开始
var frame = scrollView.frame//获得滚动视图当前的显示区域
//根据页面控制器对象的目标页码,计算滚动视图在下一页中的显示区域
frame.origin.x = frame.size.width * crtPage
frame.origin.y = 0
scrollView.scrollRectToVisible(frame, animated: true)//然后滚动视图到目标区域
isPageControlUsed = true//设置通过页面控制器对象切换页面
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {//创建监听滚动视图的滚动事件的代理方法
if(!isPageControlUsed)//如果是通过页面控制器对象切换页面,则不执行后面的代码
{
let pageWidth = scrollView.frame.size.width //获取滚动视图的宽度值
let page = floor((scrollView.contentOffset.x - pageWidth/2)/pageWidth) + 1//根据滚动视图的宽度值和横向位移量,计算当前的页码
pageControl.currentPage = Int(page)//设置页面控制器的显示页码,为通过计算所得的页码
}
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView) {//创建监听滚动视图的滚动减速事件的代理方法,重置标识变量的默认值
isPageControlUsed = false
}
}
上例中FirstViewController 以及SecondViewController为对应的UIviewcontroller子类,这里不再列出。顺便简单说一下:
scrollView的几个属性contentSize contentOffset contentInset
1. contentSize是scrollview可以滚动的区域,比如frame = (0 ,0 ,320 ,480) contentSize = (320 ,960),代表你的scrollview可以上下滚动,滚动区域为frame大小的两倍。
2. contentOffset是scrollview当前显示区域顶点相对于frame顶点的偏移量,比如上个例子你拉到最下面,contentoffset就是(0 ,480),也就是y偏移了480
3. contentInset是scrollview的contentview的顶点相对于scrollview的位置,例如你的contentInset = (0 ,100),那么你的contentview就是从scrollview的(0 ,100)开始显示