swift 輪播圖(三) 添加自動輪播功能

前言: 對閉包使用 不是很明白,可能會造成內存泄漏,請多擔待!

效果圖:
在這裏插入圖片描述

代碼

//
//  LHWhellPlantImage.swift
//  safari
//
//  Created by 磊懷王 on 2019/12/2.
//  Copyright © 2019 磊懷王. All rights reserved.
//

import UIKit

class LHWhellPlantImage: NSObject,UIScrollViewDelegate {
    
    override init() {
        super.init()
    }
    
    var line_Arr : [UIView] = Array.init()
    
    var globalScroll : UIScrollView? = nil
    
    
    /// 輪播圖的實現類
    /// - Parameters:
    ///   - imageArr: 原始圖片數組   即圖片的名字
    ///   - superView: 所要加載的父視圖
    ///   - rect: 輪播圖的位置
    func initWhellPantImage(_ imageArr : Array<String>,_ superView : UIView,_ rect : CGRect) -> UIView {
        let vi = UIView.init(frame: rect)
        superView.addSubview(vi)
        
        let imageScro : UIScrollView = UIScrollView.init()
        self.globalScroll = imageScro
        imageScro.frame = CGRect.init(x: 0, y: 0, width: Int(vi.frame.size.width), height: Int(vi.frame.size.height))
        imageScro.backgroundColor = UIColor.black
        vi.addSubview(imageScro)
        
        let scroW = imageScro.frame.size.width
        let scroH = imageScro.frame.size.height
        
        var newImageArr : Array<String> = Array.init()
        newImageArr += imageArr
        newImageArr.insert(imageArr.last!, at: 0)
        newImageArr.insert(imageArr.first!, at: newImageArr.count)
        for tempImage in newImageArr.enumerated() {
            print(tempImage)
            let imageR : CGRect = CGRect.init(x: scroW * CGFloat(tempImage.offset), y: 0, width: scroW, height: scroH)
            
            let imageV = UIImageView.init(frame: imageR)
            imageV.image = UIImage.init(named: tempImage.element)
            imageScro.addSubview(imageV)
            // 添加點擊事件
            let tap = UITapGestureRecognizer.init(target: self, action: #selector(touchWhellImage(_:)))
            imageV.addGestureRecognizer(tap)
            imageV.isUserInteractionEnabled = true
            imageV.tag = 100 + tempImage.offset
        }
        
        imageScro.contentSize = CGSize.init(width: scroW * CGFloat(newImageArr.count), height: scroH)
        imageScro.contentOffset = CGPoint.init(x: scroW, y: 0);
        imageScro.isUserInteractionEnabled = true
        imageScro.isPagingEnabled = true
        imageScro.delegate = self
        
        return vi
    }
    let markW = 12
    var allPageNum = 0
    
    func initWhellWithMark(_ imageArr : Array<String>,_ superView : UIView,_ rect : CGRect) -> Void {
        allPageNum = imageArr.count
        let endScroll = self.initWhellPantImage(imageArr, superView, rect)
        var diff_v = 0.0
        for tempObj in imageArr.enumerated() {
            var line_w = markW
            
            if tempObj.offset == 0 {
                line_w += 6
            }else{
                line_w = 12
            }
            let point_x = Float(imageArr.count) * Float(markW) * 1.5 + Float(markW)
            let l_rect = CGRect.init(x: rect.width - CGFloat(point_x) +  CGFloat(diff_v), y: rect.size.height - CGFloat(14), width: CGFloat(line_w), height: CGFloat(4))
            
            let line = UIView.init(frame: l_rect)
            line.backgroundColor = UIColor.white
            endScroll.addSubview(line)
            diff_v += Double(l_rect.size.width) + Double(markW) / 2.0
            
            line_Arr.append(line)
        }
        
        self.autoBannerPage()
    }
    var currentP = 0
    
    
    
    //  添加時間控制器
    func autoBannerPage() -> Void {
        
        let timer : Timer = Timer.scheduledTimer(withTimeInterval: 3, repeats: true) { (Timer) in
            print("dongle")
            UIView.animate(withDuration: 0.3, animations: {
                [weak self] in self?.currentP += 1
                self!.globalScroll?.contentOffset = CGPoint.init(x: (self?.globalScroll?.frame.size.width)! * CGFloat(self!.currentP + 1), y: 0)
                self!.autoLine(self!.currentP)
                print("block動畫 --- \(String(describing: self?.currentP))")
            }) { (complete) in
                if self.currentP == self.allPageNum {
                    self.currentP = 0
                    self.globalScroll?.contentOffset = CGPoint.init(x: (self.globalScroll?.frame.size.width)!, y: 0)
                }
                print("block裏面 --- \(self.currentP)")
            }
            print("block外面 --- \(self.currentP)")
            
            
        }
        
        timer.fireDate = Date.init(timeIntervalSinceNow: 3)
    }
    
    
    func autoLine(_ page : Int) -> Void {
        if page == allPageNum  {
            let line_y = line_Arr.first?.frame.origin.y
            let line_h = line_Arr.first?.frame.size.height
            
            for objc in line_Arr.enumerated() {
                if objc.element == line_Arr.first! {
                    objc.element.frame = CGRect.init(x: objc.element.frame.origin.x, y: line_y!, width: CGFloat(Float(markW) * 1.5), height: line_h!)
                }else if objc.element == line_Arr.last! {
                    objc.element.frame = CGRect.init(x: objc.element.frame.origin.x + CGFloat(Float(markW) * 0.5), y: line_y!, width: CGFloat(markW), height: line_h!)
                }else{
                    objc.element.frame = CGRect.init(x: objc.element.frame.origin.x + CGFloat(Float(markW) * 0.5), y: line_y!, width: CGFloat(markW), height: line_h!)
                }
            }
        }else{
            let currentL = line_Arr[page]
            let next = line_Arr[page - 1]
            let line_w = currentL.frame.size.width
            let line_h = currentL.frame.size.height
            let line_y = currentL.frame.origin.y
            
            currentL.frame = CGRect.init(x: currentL.frame.origin.x - CGFloat(Float(markW) / 2), y: line_y, width: line_w + CGFloat(Float(markW) / 2), height: line_h)
            next.frame = CGRect.init(x: next.frame.origin.x, y: line_y, width: CGFloat(markW), height: line_h)
        }
    }
    
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        let scroW = scrollView.frame.size.width
        let pageAll = scrollView.contentSize.width / scroW
        let page = scrollView.contentOffset.x / scroW
        if page == 0 {
            scrollView.contentOffset = CGPoint.init(x: scroW * CGFloat(pageAll - 2), y: 0)
        }else if page == (pageAll - 1){
            scrollView.contentOffset = CGPoint.init(x: scroW, y: 0)
        }
    }
    
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let page = scrollView.contentOffset.x / scrollView.frame.size.width;
        let parcentPage = Double(page) - floor(Double(page))
        let allPage = scrollView.contentSize.width / scrollView.frame.size.width - CGFloat(2)
        self.currentP = Int(page - 1)
        if parcentPage == 0 {
            return
        }
        var currentV = UIView.init()
        var nextV = UIView.init()
        
        if page < 1 {
            currentV = line_Arr.first!
            nextV = line_Arr.last!
        }else if page > allPage {
            currentV = line_Arr.last!
            nextV = line_Arr.first!
        }else{
            currentV = line_Arr[Int(floor(Double(page))) - 1]
            nextV = line_Arr[Int(ceil(Double(page)) - 1)]
        }
        //當前 指示圖
        let point_x = scrollView.frame.size.width - (CGFloat(Float(allPage) * Float(Float(markW) * 1.5))) - CGFloat(markW)
        
        let current_v_x = Double(point_x) + (1.5 * Double(markW)) * (floor(Double(page)) - 1)
        let current_v_y = Double(currentV.frame.origin.y)
        let current_v_w = Float(markW) * 1.5 - Float(Double(markW / 2) * parcentPage)
        let current_v_h = Double(currentV.frame.size.height)
    
        // 接下來的指示圖
        let next_v_x = current_v_x + Double(Float(markW) * 1.5) + Double(markW / 2) - Double((Float(markW) / 2) * Float(parcentPage))
        let next_v_w = Double(markW) + Double(markW / 2) * parcentPage
        
        if page < 1 {
            for temp in line_Arr.enumerated() {
                if temp.offset == 0 {
                    currentV.frame = CGRect.init(x: Double(point_x), y: current_v_y, width: Double(markW) * 1.5 - Double(markW) * 0.5 * (1.0 - parcentPage), height: current_v_h);
                }else if temp.offset == Int(allPage - 1) {
                    let n_x = Double(point_x) + (1.5 * Double(markW)) * Double(Int(allPage) - 1) + Double(markW) / 2.0
                    nextV.frame = CGRect.init(x: n_x - (Double(markW) / 2.0) * (1.0 - parcentPage), y: current_v_y, width: Double(markW) + (Double(markW) / 2.0) * (1.0 - parcentPage) , height: current_v_h)
                }else{
                    let v_x = Double(point_x) + (1.5 * Double(markW)) * Double(temp.offset) + Double(markW) / 2.0
                    temp.element.frame = CGRect.init(x: v_x - Double(Float(markW) / 2.0) * (1.0 - parcentPage), y: current_v_y, width: Double(markW), height: current_v_h)
                }
            }
        }else if page > allPage {
            for temp in line_Arr.enumerated() {
                if temp.offset == Int(allPage - 1) {
                    currentV.frame = CGRect.init(x: current_v_x + Double(Float(markW) / 2) * parcentPage, y: current_v_y, width: Double(current_v_w), height: current_v_h);
                }else if temp.offset == 0 {
                    nextV.frame = CGRect.init(x: Double(point_x), y: current_v_y, width: Double(markW) + (Double(markW) / 2.0) * parcentPage , height: current_v_h)
                }else{
                    let v_x = Double(point_x) + (1.5 * Double(markW)) * Double(temp.offset)
                    temp.element.frame = CGRect.init(x: v_x + Double(Float(markW) / 2.0) * parcentPage, y: current_v_y, width: Double(markW), height: current_v_h)
                }
            }
        }else{
            currentV.frame = CGRect.init(x: current_v_x, y: current_v_y, width: Double(current_v_w), height: current_v_h)
            nextV.frame = CGRect.init(x: Double(next_v_x), y: current_v_y, width: next_v_w, height: current_v_h)
        }
        
        print("拖動了---\(page) ----- \(ceil(Double(page))) ---- \(parcentPage)")
    }
    
    @objc func touchWhellImage(_ ges : UITapGestureRecognizer) -> Void {
        print("點擊了第\(ges.view!.tag - 100)張圖片")
    }
}

引用:

func bannerScroller() -> Void {
        let imageArr : Array = ["scroll001","scroll002","scroll003","scroll004","scroll005","scroll006","scroll007","scroll008","scroll009"]
        let rect : CGRect = CGRect.init(x: 10, y: 200, width: UIScreen.main.bounds.size.width - 20, height: 100)
        
        whell.initWhellWithMark(imageArr, self.view, rect)
    }

我是磊懷 2849765859 是我qq 歡迎聯繫我,批評指正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章