使用UIScrollView展示多个视图控制器(Swift 4.2)

//
//  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)开始显示

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值