新版swift 4.0 自定義pageControl 空心點、方點硫狞、橢圓信轿、圖片等

本項目github地址:GitHub - wei287030375/WEIPageControl: 最新SWIFT 4.0 版自定義PageControl晃痴,橢圓,空心圓财忽,方形點倘核,圖片點
剛開始做swift項目,可用資源少而且每個swift版本變化太大即彪,以前的都不能拿來直接用紧唱,現(xiàn)在我參考一個object-C的PageControl自己做了一個swift版的, 參考OC資源鏈接:https://github.com/hackxhj/EllipsePageControl隶校,非常感謝原作者漏益。 本項目在原OC的功能基礎(chǔ)上進行的改進,增加了自定義點的寬度深胳,方形點绰疤,點的layer,點的圖片等功能舞终,能隨意組合使用轻庆, 基本滿足大部分的需求,寫的很簡單敛劝,大家一看就懂余爆,歡迎大家使用 由于水平有限,項目中有改進之處忘各位大神給與指點攘蔽,以求不斷完善

pageControl.gif

貼上部分代碼:
以下是部分代碼:

class WEIPageControl: UIControl {
var localNumberOfPages = NSInteger()//分頁數(shù)量
var localCurrentPage = NSInteger()//當(dāng)前點所在下標(biāo)
var localPointSize = CGSize()//點的大小
var localPointSpace = CGFloat()//點之間的間距
var localOtherColor = UIColor()//未選中點的顏色
var localCurrentColor = UIColor()//當(dāng)前點的顏色
var localOtherImage: UIImage?//未選中點的圖片
var localCurrentImage: UIImage?//當(dāng)前點的圖片
var localIsSquare = Bool()//是否是方形點
var localCurrentWidthMultiple = CGFloat()//當(dāng)前選中點寬度與未選中點的寬度的倍數(shù)
var localOtherBorderColor: UIColor?//未選中點的layerColor
var localOtherBorderWidth: CGFloat?//未選中點的layer寬度
var localCurrentBorderColor: UIColor?//未選中點的layerColor
var localCurrentBorderWidth: CGFloat?//未選中點的layer寬度
var clickIndex: ((_ result: NSInteger?) -> ())?

下面是創(chuàng)建PageControl龙屉,用UIView做的

func creatPointView() {
        for view in self.subviews {
            view.removeFromSuperview()
        }

        if localNumberOfPages <= 0 {//必須傳入總頁數(shù)
            return
        }

        var startX: CGFloat = 0
        var startY:CGFloat = 0
        let mainWidth = CGFloat(localNumberOfPages) * (localPointSize.width + localPointSpace)

        if self.frame.size.width > mainWidth {
            startX = (self.frame.size.width - mainWidth) / 2
        }

        if self.frame.size.height > localPointSize.height {
            startY = (self.frame.size.height - localPointSize.height) / 2
        }

        //創(chuàng)建點
        for index in 0 ..< numberOfPages {
            if index == localCurrentPage {//是當(dāng)前點
                let currentPointView = UIView.init()
                let currentPointViewWidth = localPointSize.width * localCurrentWidthMultiple
                currentPointView.frame = CGRect.init(x: startX, y: startY, width: currentPointViewWidth, height: localPointSize.height)
                currentPointView.backgroundColor = localCurrentColor
                currentPointView.tag = index + 1000
                currentPointView.layer.cornerRadius = localIsSquare ? 0 : localPointSize.height / 2
                currentPointView.layer.masksToBounds = true
                currentPointView.layer.borderColor = localCurrentBorderColor != nil ? localCurrentBorderColor?.cgColor : localCurrentColor.cgColor
                currentPointView.layer.borderWidth = localCurrentBorderWidth != nil ? localCurrentBorderWidth! : 0
                currentPointView.isUserInteractionEnabled = true
                self.addSubview(currentPointView)
                let tapGesture = UITapGestureRecognizer.init(target: self, action: #selector(clickAction(tapGesture:)))//添加小圓點點擊手勢
                currentPointView.addGestureRecognizer(tapGesture)
                startX = currentPointView.frame.maxX + localPointSpace

                if localCurrentImage != nil {
                    currentPointView.backgroundColor = UIColor.clear
                    let localCurrentImageView = UIImageView.init()
                    localCurrentImageView.tag = index + 2000
                    localCurrentImageView.frame = currentPointView.bounds
                    localCurrentImageView.image = localCurrentImage
                    currentPointView.addSubview(localCurrentImageView)
                }
            } else {//其他點
                let otherPointView = UIView.init()
                otherPointView.frame = CGRect.init(x: startX, y: startY, width: localPointSize.width, height: localPointSize.height)
                otherPointView.backgroundColor = localOtherColor
                otherPointView.tag = index + 1000
                otherPointView.layer.cornerRadius = localIsSquare ? 0 : localPointSize.height / 2;
                otherPointView.layer.borderColor = localOtherBorderColor != nil ? localOtherBorderColor?.cgColor : localOtherColor.cgColor
                otherPointView.layer.borderWidth = localOtherBorderWidth != nil ? localOtherBorderWidth! : 0
                otherPointView.layer.masksToBounds = true
                otherPointView.isUserInteractionEnabled = true
                self.addSubview(otherPointView)
                let tapGesture = UITapGestureRecognizer.init(target: self, action: #selector(clickAction(tapGesture:)))
                otherPointView.addGestureRecognizer(tapGesture)
                startX = otherPointView.frame.maxX + localPointSpace

                if localOtherImage != nil {
                    otherPointView.backgroundColor = UIColor.clear
                    let localOtherImageView = UIImageView.init()
                    localOtherImageView.tag = index + 2000
                    localOtherImageView.frame = otherPointView.bounds
                    localOtherImageView.image = localOtherImage
                    otherPointView.addSubview(localOtherImageView)
                }
            }
        }
    }

滑動或者點擊圓點后切換當(dāng)前點和其他點

func exchangeCurrentView(oldSelectedIndex: NSInteger, newSelectedIndex: NSInteger) {//切換當(dāng)前點和其他點
        let oldPointView = self.viewWithTag(1000 + oldSelectedIndex)
        let newPointView = self.viewWithTag(1000 + newSelectedIndex)

        oldPointView?.layer.borderColor = localOtherBorderColor != nil ? localOtherBorderColor?.cgColor : localOtherColor.cgColor
        oldPointView?.layer.borderWidth = localOtherBorderWidth != nil ? localOtherBorderWidth! : 0

        newPointView?.layer.borderColor = localCurrentBorderColor != nil ? localCurrentBorderColor?.cgColor : localCurrentColor.cgColor
        newPointView?.layer.borderWidth = localCurrentBorderWidth != nil ? localCurrentBorderWidth! : 0

        oldPointView?.backgroundColor = localOtherColor
        newPointView?.backgroundColor = localCurrentColor

        if localCurrentWidthMultiple != 1 {//如果當(dāng)前選中點的寬度與未選中的點寬度不一樣,則要改變選中前后兩點的frame
            var oldPointFrame = oldPointView?.frame
            if newSelectedIndex < oldSelectedIndex {
                oldPointFrame?.origin.x += localPointSize.width * (localCurrentWidthMultiple - 1)
            }
            oldPointFrame?.size.width = localPointSize.width
            oldPointView?.frame = oldPointFrame!

            var newPointFrame = newPointView?.frame
            if newSelectedIndex > oldSelectedIndex {
                newPointFrame?.origin.x -= localPointSize.width * (localCurrentWidthMultiple - 1)
            }
            newPointFrame?.size.width = localPointSize.width * localCurrentWidthMultiple
            newPointView?.frame = newPointFrame!
        }

        if localCurrentImage != nil {//切換選中圖片和未選中圖片
            let view = oldPointView?.viewWithTag(oldSelectedIndex + 2000)

            if view != nil {
                let oldlocalCurrentImageView = view as! UIImageView

                oldlocalCurrentImageView.frame = CGRect.init(x: 0, y: 0, width: localPointSize.width, height: localPointSize.height)
                oldlocalCurrentImageView.image = localOtherImage
            }
        }

        if localOtherImage != nil {//切換選中圖片和未選中圖片
            let view = newPointView?.viewWithTag(newSelectedIndex + 2000)
            if view != nil {
                let oldlocalOtherImageView = view as! UIImageView
                let width = localPointSize.width * localCurrentWidthMultiple

                oldlocalOtherImageView.frame = CGRect.init(x: 0, y: 0, width: width, height: localPointSize.height)
                oldlocalOtherImageView.image = localCurrentImage

            }
        }

        if newSelectedIndex - oldSelectedIndex > 1 {//點擊圓點满俗,中間有跳過的點
            for index in oldSelectedIndex + 1 ..< newSelectedIndex {
                let view = self.viewWithTag(1000 + index)
                var frame = view?.frame
                frame?.origin.x -= localPointSize.width * (localCurrentWidthMultiple - 1)
                frame?.size.width = localPointSize.width
                view?.frame = frame!
            }
        }

        if newSelectedIndex - oldSelectedIndex < -1 {//點擊圓點转捕,中間有跳過的點
            for index in newSelectedIndex + 1 ..< oldSelectedIndex {
                let view = self.viewWithTag(1000 + index)
                var frame = view?.frame
                frame?.origin.x += localPointSize.width * (localCurrentWidthMultiple - 1)
                frame?.size.width = localPointSize.width
                view?.frame = frame!
            }
        }
    }

在ViewController中使用
//方形點舉例


override func viewDidLoad() {
        super.viewDidLoad()

        self.view.backgroundColor = UIColor.black

        let width: CGFloat = UIScreen.main.bounds.size.width * 0.7
        let height: CGFloat = 100
        let left: CGFloat = 50
        let pageCount = 5

          //寬一點的方點
        scrollView3.frame = CGRect.init(x: left, y: pageControl2.frame.maxY + 30, width: width, height: height)
        scrollView3.delegate = self
        scrollView3.tag = 3
        scrollView3.isPagingEnabled = true
        scrollView3.contentSize = CGSize.init(width: width * CGFloat(pageCount), height: 0)
        for index in 0 ..< pageCount {
            let imageView = UIImageView.init()
            imageView.frame = CGRect.init(x: CGFloat(index) * width, y: 0, width: width, height: height)
            imageView.backgroundColor = UIColor.init(red: CGFloat(arc4random()%255) / CGFloat(255), green: CGFloat(arc4random()%255) / CGFloat(255), blue: CGFloat(arc4random()%255) / CGFloat(255), alpha: 1)
            scrollView3.addSubview(imageView)
        }
        pageControl3 = WEIPageControl()//初始化PageControl
        pageControl3.frame = CGRect.init(x: left, y: scrollView3.frame.maxY, width: width, height: 20)
        pageControl3.numberOfPages = pageCount//總頁數(shù)
        pageControl3.isSquare = true//設(shè)置為方型點
        pageControl3.currentWidthMultiple = 2.5//當(dāng)前點的寬度為其他點的2.5倍
        pageControl3.currentColor = UIColor.red
        pageControl3.otherColor = UIColor.blue
        pageControl3.pointSize = CGSize.init(width: 14, height: 6)//方點的size
        pageControl3.clickPoint { (index) in//方點的點擊事件
            self.scrollView3.setContentOffset(CGPoint.init(x: width * CGFloat(index!), y: 0), animated: true)
        }
        self.view.addSubview(scrollView3)
        self.view.addSubview(pageControl3)
    }

代碼很簡單,一看就懂唆垃,歡迎各位大神給與指導(dǎo)意見以不斷完善五芝。
本項目github地址:GitHub - wei287030375/WEIPageControl: 最新SWIFT 4.0 版自定義PageControl,橢圓辕万,空心圓枢步,方形點,圖片點
如果覺得對你有幫助請給個star吧渐尿,也是對以后繼續(xù)創(chuàng)作的一種鼓勵醉途,謝謝

歡迎轉(zhuǎn)載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市砖茸,隨后出現(xiàn)的幾起案子隘擎,更是在濱河造成了極大的恐慌,老刑警劉巖凉夯,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件货葬,死亡現(xiàn)場離奇詭異采幌,居然都是意外死亡,警方通過查閱死者的電腦和手機震桶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門休傍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蹲姐,你說我怎么就攤上這事磨取。” “怎么了柴墩?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵寝衫,是天一觀的道長。 經(jīng)常有香客問我拐邪,道長,這世上最難降的妖魔是什么隘截? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任扎阶,我火速辦了婚禮,結(jié)果婚禮上婶芭,老公的妹妹穿的比我還像新娘东臀。我一直安慰自己,他們只是感情好犀农,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布惰赋。 她就那樣靜靜地躺著,像睡著了一般呵哨。 火紅的嫁衣襯著肌膚如雪赁濒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天孟害,我揣著相機與錄音拒炎,去河邊找鬼。 笑死挨务,一個胖子當(dāng)著我的面吹牛击你,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谎柄,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼丁侄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了朝巫?” 一聲冷哼從身側(cè)響起鸿摇,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捍歪,沒想到半個月后户辱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸵钝,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年庐镐,在試婚紗的時候發(fā)現(xiàn)自己被綠了恩商。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡必逆,死狀恐怖怠堪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情名眉,我是刑警寧澤粟矿,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站损拢,受9級特大地震影響陌粹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜福压,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一掏秩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荆姆,春花似錦蒙幻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仆救,卻和暖如春抒和,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背派桩。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工构诚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铆惑。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓范嘱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親员魏。 傳聞我的和親對象是個殘疾皇子丑蛤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件撕阎、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • 一. JQueryMobile jQuery Mobile is a HTML5-based user inter...
    我不叫奇奇閱讀 556評論 0 2
  • 今年來老板提到最多的一個詞就是聚勢了受裹。如何讓團隊能量最大化。無非也就是產(chǎn)品-市場-銷售的能量能聚到一起再發(fā)揮作用。...
    Maylissa閱讀 1,262評論 2 0
  • miss ,錯過還是想念 【女】 那年,我十六歲初踏入這個校園照藻,懵懂袜啃、羞澀。初遇你...
    梅夕夕閱讀 1,074評論 2 2
  • 把你的聲音攏進一雙綠瓷杯與碗都是冷的而你總是恒溫直到某個夜里蘇州河起火你掌中的冷煙燒盡漸漸苦而沉
    倒影海王星閱讀 284評論 0 1