UIScrollView的詳細(xì)使用
創(chuàng)建實例對象并初始化
let scrollView = UIScrollVeiw(frame: self.view.frame)
let subViewOne = UIView(frame: self.view.frame)
let subViewTwo = UIView(frame: CGReact(x: self.view.frame.size.width, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height))
scrollView.addSubView(subViewOne)
scrollView.addSubView(subViewTwo)
scrollView.contentSize = CGSize(width: self.view.frame.size.width * 2, height: self.view.frame.size.height)?
scrollView.alwaysBounceVertical = true
scrollView.alwaysBounceHorizontal = true
scrollView.bouns = true
scrollView.showsVerticalScrollIndicator = true
scrollView.showsHorizontalScrollIndicator = false
scrollView.isPagingEnabled = true
常見的代理方法
1 滑動過程中?scrollViewDidScroll(scrollView: UIScrollView)
2?開始拖動?scrollViewWillBeginDragging(scrollView: UIScrollView)
3?開始拖動(以某種速率和偏移量) ?scrollViewDidEndDecelerating(scrollView: UIScrollView)
4?停止拖動?scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool)
5?開始滑動?scrollViewWillBeginDecelerating(scrollView: UIScrollView)
代碼如下:
//
//? ViewController.swift
//? ScrollView
//
//? Created by swift on 2019/12/31.
//? Copyright ? 2019 kydqitb. All rights reserved.
//
importUIKit
class ViewController: UIViewController, UIScrollViewDelegate {
? ? letview1=UIView()
? ? letview2=UIView()
? ? letview3=UIView()
? ??override func viewDidLoad() {
? ? ? ? super.viewDidLoad()
? ? ? ? // Do any additional setup after loading the view.
? ? ? ? addTitleLabel()
?? ? ? ?setViews()
? ? ? ? addScrollView()
? ? }
? ? func addTitleLabel() {
? ? ? ? lettitle =UILabel(frame:CGRect(x:0, y:40, width:self.view.frame.width, height:40))
? ? ? ? title.textAlignment = .center
? ? ? ? title.text = "UIScrollView基礎(chǔ)使用"
? ? ? ? self.view.addSubview(title)
? ? }
? ??func addScrollView() {
? ? ? ? letscrollView =UIScrollView()
? ? ? ? view.addSubview(scrollView)
? ? ? ? addAutoLayout(obj: scrollView)
?? ? ? ?scrollView.delegate=self;
? ? ? ? //設(shè)置scrollView的背景顏色
? ? ? ? scrollView.backgroundColor=UIColor.red
? ? ? ? scrollView.contentSize=CGSize(width:view.frame.width, height:500*4)// ContentSize屬性,滑動內(nèi)容寬度和高度
//修改滑動光標(biāo)的顏色
? ? ? ? /**
? ? ? ? ? default // 默認(rèn)灰色廣標(biāo)
? ? ? ? ? black // 黑色光標(biāo)
? ? ? ? ? white // 白色光標(biāo)
?? ? ? ? */
? ? ? ? scrollView.indicatorStyle = UIScrollView.IndicatorStyle.black
? ? ? ? //true滑動到邊緣時光標(biāo)具有反彈效果(光標(biāo)變短)
? ? ? ? scrollView.bounces=true
? ? ? ? //分頁效果 每次移動一個格
?? ? ? ?scrollView.contentOffset=CGPoint(x:50, y:500)
? ? ? // 顯?示?水平滾動條(默認(rèn)為true)
? ? ? ? scrollView.showsHorizontalScrollIndicator = true
? ? ? ? //顯?示垂直滾動條(默認(rèn)為true)
? ? ? ? scrollView.showsVerticalScrollIndicator = true
? ? ? ? //設(shè)置UIScrollView的縮放大小(默認(rèn)縮放小大為1.0)
? ? ? ? scrollView.minimumZoomScale=0.2
? ? ? ? scrollView.maximumZoomScale=2
? ? ? ? // 縮放回彈(默認(rèn)為true,在超出縮放范圍會有一個回彈效果)
? ? ? ? scrollView.bouncesZoom=true
? // 點擊設(shè)備狀態(tài)欄會自動滾動到頂部
? ? ? ? scrollView.scrollsToTop=true? ? ? ?
?//把view添加到scrollView上
? ? ? ? scrollView.addSubview(view1)
? ? ? ? scrollView.addSubview(view2)
? ? ? ? scrollView.addSubview(view3)
?? ?}
? ? func?setViews() {
? ? ? ? view1.backgroundColor = UIColor.gray
?? ? ? ?view1.frame=CGRect(x:0, y:0, width:view.frame.width, height:500)//此約束相對于scrollView.contentSize大小進(jìn)行約束
? ? ? ?view2.backgroundColor = UIColor.green
?? ? ? view2.frame=CGRect(x:0, y:500, width:view.frame.width, height:500) ? ? ? ? ? ? ??
? ? ? ?view3.backgroundColor = UIColor.blue
? ? ? ? view3.frame=CGRect(x:0, y:1000, width:view.frame.width, height:500)
? ? }
? ?//MARK: - scrollView代理方法
? ? //scrollView滾動時調(diào)用,只要offset的值發(fā)生變化就調(diào)用
? ? funcscrollViewDidScroll(_scrollView:UIScrollView) {
? ? ? ? //打印視圖偏移量
? ? ? ? print("X:\(scrollView.contentOffset.x)")
? ? ? ? print("Y:\(scrollView.contentOffset.y)")
//? ? ? ? print("Y:\()")
? ? }
? ? //返回將要縮放的UIView對象
? ? funcviewForZooming(in scrollView:UIScrollView) ->UIView? {
? ? ? ? print("viewForZooming")
? ? ? ? //遍歷scrollView的子view,找到自己的view
? ? ? ? forsubview:AnyObjectinscrollView.subviews{
? ? ? ? ? ? ifsubview.isKind(of:UIView.self){
? ? ? ? ? ? ? ? returnsubviewas?UIView
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? returnnil
? ? }
? ? //當(dāng)將要開始縮放時,執(zhí)行該方法。一次有效縮放就只執(zhí)行一次
? ? funcscrollViewWillBeginZooming(_scrollView:UIScrollView, with view:UIView?) {
? ? ? ? print("scrollViewWillBeginZooming")
? ? }
? ? //當(dāng)scrollView縮放時,調(diào)用該方法。在縮放過程中,會多次調(diào)用
? ? funcscrollViewDidZoom(_scrollView:UIScrollView) {
? ? ? ? print("scrollViewDidZoom")
? ? }
? ? //當(dāng)縮放結(jié)束后,并且縮放大小回到minimumZoomScale與maximumZoomScale之間后(我們也許會超出縮放范圍),調(diào)用該方法
? ? funcscrollViewDidEndZooming(_scrollView:UIScrollView, with view:UIView?, atScale scale:CGFloat) {
? ? ? ? print("scrollViewDidZoom scale: %f", scale)
? ? }
? ? //指示當(dāng)用戶點擊狀態(tài)欄后,滾動視圖是否能夠滾動到頂部
? ? func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {
? ? ? ? print("scrollViewShouldScrollToTop")
? ? ? ? //返回值:true可以返回到頂端, false不能返回到頂端
? ? ? ? return true
? ? }
? ? //當(dāng)滾動視圖滾動到最頂端后,執(zhí)行該方法
? ? func scrollViewDidScrollToTop(_ scrollView: UIScrollView) {
? ? ? ? print("scrollViewDidScrollToTop")
? ? }
? ? //當(dāng)開始滾動視圖時,執(zhí)行該方法。一次有效滑動只執(zhí)行一次
? ? func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
? ? ? ? print("scrollViewWillBeginDragging")
? ? }
? ? //當(dāng)開始滾動視圖時,執(zhí)行該方法。一次有效滑動只執(zhí)行一次
? ? funcscrollViewDidEndDragging(_scrollView:UIScrollView, willDecelerate decelerate:Bool) {
? ? ? ? print("scrollViewDidEndDragging")
? ? }
? ? //滑動減速時調(diào)用該方法
? ? func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
? ? ? ? print("scrollViewWillBeginDecelerating")
? ? }
? ? //滾動視圖減速完成,滾動將停止時,調(diào)用該方法。一次有效滑動只執(zhí)行一次
? ? func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
? ? ? ? print("scrollViewDidEndDecelerating")
? ? }
? ? //當(dāng)滾動視圖動畫完成后,調(diào)用該方法,如果沒有動畫,那么該方法將不被調(diào)用
? ? func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
? ? ? ? print("scrollViewDidEndScrollingAnimation")
? ? }
? ? //滑動scrollView,并且手指離開時執(zhí)行。一次有效滑動只執(zhí)行一次(當(dāng)pagingEnabled屬性為true時,不調(diào)用該方法)
? ? funcscrollViewWillEndDragging(_scrollView:UIScrollView, withVelocity velocity:CGPoint, targetContentOffset:UnsafeMutablePointer) {
? ? ? ? print("scrollViewWillEndDragging")
? ? }
? ? //AutoLayout 自動布局
? ? func?addAutoLayout(obj:UIScrollView) {
? ? //除了AutoLayout,AutoresizingMask也是一種布局方式。當(dāng)我們用AutoLayout代碼添加視圖時默認(rèn)情況下,translatesAutoresizingMaskIntoConstraints = true , 此時視圖的AutoresizingMask會被轉(zhuǎn)換成對應(yīng)效果的約束。這樣很可能就會和我們手動添加的其它約束有沖突。此屬性設(shè)置成false時,AutoresizingMask就不會變成約束。也就是說當(dāng)前視圖的 AutoresizingMask失效了。 避免布局沖突,把此設(shè)置為false
? ? ? ? obj.translatesAutoresizingMaskIntoConstraints = false
? ? ? ? //? ? ? ? 自動布局構(gòu)造函數(shù)
? ? ? ? //? ? ? ? NSLayoutConstraint(item: 視圖,
? ? ? ? //? ? ? ? ? ? ? attribute: 約束屬性,
? ? ? ? //? ? ? ? relatedBy: 約束關(guān)系,
? ? ? ? //? ? ? ? toItem: 參照視圖,
? ? ? ? //? ? ? ? attribute: 參照屬性,
? ? ? ? //? ? ? ? multiplier: 乘積,
? ? ? ? //? ? ? ? constant: 約束數(shù)值)
? ? ? ? //設(shè)置label控件的左邊到self.view的左邊距離為50pt
? ? ? ? let objLeft:NSLayoutConstraint = NSLayoutConstraint(item: obj, attribute: NSLayoutConstraint.Attribute.left, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self.view, attribute: NSLayoutConstraint.Attribute.left, multiplier: 1.0, constant: 50)
? ? ? ? obj.superview!.addConstraint(objLeft)
? ? ?//設(shè)置label控件的頂部到self.view的頂部距離為100pt
? ? ? ? let objTop:NSLayoutConstraint = NSLayoutConstraint(item: obj, attribute: NSLayoutConstraint.Attribute.top, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self.view, attribute: NSLayoutConstraint.Attribute.top, multiplier: 1.0, constant: 100)
? ? ? ? obj.superview!.addConstraint(objTop)
? ? ?//設(shè)置label控件的右邊到self.view的右邊距離為50pt
? ? ? ? let objRight:NSLayoutConstraint = NSLayoutConstraint(item: obj, attribute: NSLayoutConstraint.Attribute.right, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self.view, attribute: NSLayoutConstraint.Attribute.right, multiplier: 1.0, constant: -50)
? ? ? ? obj.superview!.addConstraint(objRight)
? ? ? ?let objBottom:NSLayoutConstraint = NSLayoutConstraint(item: obj, attribute: NSLayoutConstraint.Attribute.bottom, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self.view, attribute: NSLayoutConstraint.Attribute.bottom, multiplier: 1.0, constant: -100)
? ? ? ?obj.superview!.addConstraint(objBottom)
//? ? ? ? //設(shè)置label控件的高度為200pt
//? ? ? ? let objHeight:NSLayoutConstraint = NSLayoutConstraint(item: obj, attribute: NSLayoutConstraint.Attribute.height, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute:NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1.0, constant: 400)
//? ? ? ? obj.superview!.addConstraint(objHeight)
? ? }
}