自定義Swift版SegmentControl
系統的UISegmentControl雖然可以動態計算寬度,但是不能滾動。0..0鑑於需求,所以還是苦逼自己擼了一個Swift版。滿足動態調節segment寬度,以及自動調整滾動位置,選擇紅點顯示。
效果圖:
主要的一些思路(同時希望大神能提下意見~~):
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=================
//就是辣麼簡單。。。。。。
//求鼓勵
相關文章
- Swift 自定義運算子Swift
- Swift中自定義運算子Swift
- swift4.0 自定義LOGSwift
- Swift 自定義 UIDatePickerSwiftUI
- Swift - 自定義Share分享頁面Swift
- 自定義身份證鍵盤(Swift)Swift
- Swift自定義表情鍵盤+錄音Swift
- swift 自定義正規表示式運算子 =~Swift
- 自定義TabBar動畫效果 - 頁面轉場(Swift)tabBar動畫Swift
- iOS Swift和OC專案中自定義LogiOSSwift
- 2018-08-06 swift 自定義hudSwift
- Swift 專案總結 03 自定義 CollectionView 佈局SwiftView
- 仿網易新聞頭部多按鈕選擇器-SegmentControl-SwiftSwift
- Swift 專案總結 04 - 自定義控制器轉場Swift
- Swift 專案總結 04 自定義控制器轉場Swift
- Swift UIWebView 獲取404,504等載入自定義介面SwiftUIWebView
- Swift 小貼士:語言的擴充套件和自定義Swift套件
- 自定義View:自定義屬性(自定義按鈕實現)View
- 使用AVPlayer自定義支援全屏的播放器(五)—Swift重構版本播放器Swift
- 08.Django自定義模板,自定義標籤和自定義過濾器Django過濾器
- 【Swift】自定義控制元件無限輪播 + 無限圖片輪播Swift控制元件
- Swift中使用MPMoviePlayerController實現自定義視訊播放器介面SwiftController播放器
- 自定義ImageView完成圓形頭像自定義View
- 專業版即將支援自定義場景測試
- 自定義VIEWView
- 自定義圓環
- 自定義SnackBar
- 自定義useState
- 自定義_ajax
- 自定義Annotation
- 自定義OrderedMap
- 自定義 Drawable
- 自定義UICollectionViewLayoutUIView
- 自定義UITabBarUItabBar
- 自定義scrollbar
- 自定義Drawable
- 自定義ToastAST
- 自定義吐司