自定義Swift版SegmentControl

weixin_34162695發表於2016-11-17

      系統的UISegmentControl雖然可以動態計算寬度,但是不能滾動。0..0鑑於需求,所以還是苦逼自己擼了一個Swift版。滿足動態調節segment寬度,以及自動調整滾動位置,選擇紅點顯示。 

效果圖:


3346554-1f556abb5dc3ea08.gif

主要的一些思路(同時希望大神能提下意見~~):

a.新增scrollView,然後在上面佈局各個item,達到可供滾動的需求。通過autoAdjustWidth屬性判斷是否自動計算各個item的寬度。如果不自動的話,就width = frame/numbersOfSegment,自動的話則計算label顯示所需要的寬度。

b.在可供滾動的需求上,繼續挖出一個自動調整位置的需求。讓選擇的item顯示在可視範圍,同時顯示出盡頭是否還有item的情況。額,挺簡單的,直接上程式碼:

private func scrollItemToPoint(index : Int,point:CGPoint) {

        let currentX = currentItemX(index: index)

        let scrollViewWidth = scrollView.bounds.size.width

        var scrollX = currentX - point.x + segmentWidth(index: index) * 0.5

        let maxScrollX = scrollView.contentSize.width - scrollViewWidth

        if scrollX > maxScrollX {

                    scrollX = maxScrollX

          }

         if scrollX < 0.0 {

                     scrollX = 0.0

             }

          scrollView.setContentOffset(CGPoint(x: scrollX, y: 0.0), animated: true)

}

c.紅點新增。考慮到要顯示紅點,所以不直接使用UILabel當Item,而是自定義JTItemView,裡面放著label,和一個紅點CALayer檢視。(本來想著自定義一個label子類,然後新增layer當做紅點就行,但是考慮到可能以後還要擴充套件item的特性,所以直接使用了UIView的子類。)。

提供了一個方法進行紅點控制:func showBridge(show:Bool, index:Int)。

0.0接下來說說腫麼使用~

1.平分佈局:

var frame = CGRect(x: 10.0, y: 130.0, width: self.view.bounds.size.width - 20.0, height: 44.0)

let segmentControl = JTSegmentControl(frame: frame)

segmentControl.delegate = self

segmentControl.items = ["first", "second", "third", "fouth"]

segmentControl.showBridge(show: true, index: 1)

segmentControl.autoScrollWhenIndexChange = false

view.addSubview(segmentControl)

2.自動計算item寬度(autoAdjustWidth)

frame = CGRect(x: 10.0, y: 250.0, width: self.view.bounds.size.width - 20.0, height: 44.0)

let autoWidthControl = JTSegmentControl(frame: frame)

autoWidthControl.delegate = self

autoWidthControl.items = ["first", "second", "third", "fouth", "fifth", "sixth", "seventh", "eighth"]

autoWidthControl.selectedIndex = 1

autoWidthControl.autoAdjustWidth = true

autoWidthControl.bounces = true

view.addSubview(autoWidthControl)

~還有一些樣式的屬性可供修改:

// JTSegmentPattern.swift

static let itemTextColor //item字型顏色

static let itemSelectedTextColor //選擇狀態的顏色

static let itemBackgroundColor //背景色

static let itemSelectedBackgroundColor //選中狀態背景色

//MARK - Text font

static let textFont //字型

static let selectedTextFont //選中狀態字型

//MARK - slider

static let sliderColor //滑動條顏色

static let sliderHeight  //滑動條高度

//MARK - bridge

static let bridgeColor //紅點顏色

提供代理方法通知外界:

optional func didSelected(segement:JTSegmentControl, index: Int) //選擇了Item後觸發

=============STOP=================

//就是辣麼簡單。。。。。。

//求鼓勵

https://github.com/guangzhouxia/JTSegmentControl

相關文章