swift4--UIScrollView

87 阅读3分钟
//
//  ViewController0201.swift
//  演示demo
//


import UIKit

class ViewController0201: UIViewController , UIScrollViewDelegate {
    
    //滚动视图是一个可以拖动的组件
    
    var scrollView = UIScrollView()
    
    //添加一个控制翻页的属性
    
    var pageControl = UIPageControl()
    
    //添加一个状态属性,来标志页面的滑动状态
    
    var isPageControlUsed = false
    
    override func viewDidLoad (){
        
        super.viewDidLoad()

        self.navigationItem.title = "轮播图"
        //获取当前设备的屏幕尺寸信息

        var screenFrame = UIScreen.main.bounds
        
        let screenWidth = screenFrame.width
        
        let screenHeight = screenFrame.height
        
        scrollView.frame = screenFrame
        
        //设置分页模式,滚动一次就是一页
        
        scrollView.isPagingEnabled = true
        
        //设置滚动视图的宽度
        
        scrollView.contentSize = CGSize(width:screenWidth * 2,height:screenHeight - 64)
        
        //设置滚动视图的背景色为白色
        
        scrollView.backgroundColor = UIColor.white
        
        self.scrollView.showsHorizontalScrollIndicator = false //滚动时是否显示垂
        self.scrollView.showsVerticalScrollIndicator = false //是否加反弹效果
        self.scrollView.bounces = false //滚动条的样式
        
        //设置滚动视图对像的代理为当前类,这样就可以在当前文件中编写方法,以捕捉滚动视图的相关动作
        
        scrollView.delegate = self
        
        //在创建一个高度常量,做页面控制器对像的高度
        
        let pcHeight:CGFloat = 50.0
        
        //创建一个区域显示页面控制器对象
        
        let pcRaect = CGRect(x:0 , y:screenHeight - pcHeight , width:screenWidth , height:pcHeight)
        
        pageControl.frame = pcRaect
        
        pageControl.numberOfPages = 2
        
        pageControl.currentPage = 0
        
//        pageControl.backgroundColor = UIColor.gray
        
        //添加监听页面切换的方法
        pageControl.addTarget(self, action: #selector(self.pageControlDidChanged(_ :)) , for: UIControl.Event.valueChanged)
        //创建第一个视图控制器的实例
        
        let firstContorller = ViewController0201_1()
        
        //设置坐标原点的横向值为零
        
        screenFrame.origin.x = 0
        
        firstContorller.view.frame = screenFrame
        
        //创建第二个视图控制器的实例
        
        let secondControler = ViewController0201_2()
        
        screenFrame.origin.x = screenFrame.size.width
        
        secondControler.view.frame = screenFrame
        
        scrollView.addSubview(firstContorller.view)
        
        scrollView.addSubview(secondControler.view)
        
        self.view.addSubview(scrollView)
        
        self.view.addSubview(pageControl)
        
        //加载视图后进行任何其他设置。
        
    }
    
    @objc func pageControlDidChanged(_ sender:AnyObject)
        
    {
        
        //获取当前页码
        
        let crtPage = (CGFloat)(pageControl.currentPage)
        
        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 scrollViewDidEndDecelerating(_ scrollView:UIScrollView){
        
        isPageControlUsed = false
        
    }
    
    
}


/*
 
 其他设置
 
 scrollview?.maximumZoomScale = 2.0 //最小比例
 
 scrollview?.minimumZoomScale = 0.5 //最大比例
 
 scrollview?.canCancelContentTouches = false //当值是YES的时候,用户触碰开始。要延迟一会,看看是否用户有意图滚动。假如滚动了,那么捕捉触摸事件,否则就不捕捉。假如值是NO,当用户触碰,scroll view会立即触发
 
 scrollview.delaysContentTouches = true //分页滑动
 
 self.scrollview?.pagingEnabled = true //开启滚动
 
 self.scrollview?.scrollEnabled = true //滚动时是否显示水平滚动条
 self.scrollview?.showsHorizo​​ntalScrollIndicator = false //滚动时是否显示垂
 self.scrollview?.showsVerticalScrollIndicator = false //是否加反弹效果
 self.scrollview?.bounces = true //滚动条的样式
 
 self.scrollview?.indicatorStyle = .White //黑色:黑色;默认默认;白色
 
 设置代理
 
 scrollview ?, delegate = self
 
 实现代理方法
 
 //只要滚动了就会触发
 
 func scrollViewDidScroll(scrollView:UIScrollView){}
 
 //开始拖动视图
 
 func scrollViewWillBeginDragging(scrollView:UIScrollView){}
 
 //完成拖动
 
 func scrollViewDidEndDragging(scrollView:UIScrollView,willDecelerate减速:Bool){}
 
 //将开始降速时
 
 func scrollViewWillBeginDecelerating(scrollView:UIScrollView){}
 
 //减速停止了时执行,手触摸时执行执行
 
 func scrollViewDidEndDecelerating(scrollView:UIScrollView){}
 
 //滚动动画停止时执行,代码改变时出发,也就是setContentOffset改变时
 
 func scrollViewDidEndScrollingAnimation(scrollView:UIScrollView){}
 
 //设置放大缩小的视图,要是UIScrollView中的子视图
 
 func viewForZoomingInScrollView(scrollView:UIScrollView) - > UIView?{}
 
 //完成放大缩小时调用
 
 func scrollViewDidEndZooming(scrollView:UIScrollView,withView视图:UIView ?, atScale scale:CGFloat){}
 
 //如果你不是完全滚动到滚轴视图的顶部,你可以轻点状态栏,那个可视的滚轴视图会一直滚动到顶部,那是默认行为,你可以通过该方法返回NO来关闭它
 
 func scrollViewShouldScrollToTop(scrollView:UIScrollView) - > Bool {} func scrollViewDidScrollToTop(scrollView:UIScrollView){}