自定義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 自定義 UIDatePickerSwiftUI
- Swift中自定義運算子Swift
- Swift自定義表情鍵盤+錄音Swift
- 2018-08-06 swift 自定義hudSwift
- 自定義TabBar動畫效果 - 頁面轉場(Swift)tabBar動畫Swift
- Swift 專案總結 03 自定義 CollectionView 佈局SwiftView
- Swift 專案總結 04 - 自定義控制器轉場Swift
- Swift 專案總結 04 自定義控制器轉場Swift
- 使用AVPlayer自定義支援全屏的播放器(五)—Swift重構版本播放器Swift
- HarmonyOS NEXT 5.0自定義增強版導航欄元件|鴻蒙ArkUI自定義標題欄元件鴻蒙UI
- springboot -- 2.0版本自定義ReidsCacheManager的改變Spring Boot
- android自定義view(自定義數字鍵盤)AndroidView
- netty自定義Decoder用於自定義協議Netty協議
- 自定義 tabBartabBar
- 自定義 GitGit
- tailwind自定義AI
- 自定義元件元件
- 自定義表格
- 自定義 Anaconda
- 自定義ClassLoader
- 自定義QTimeEditQT
- 自定義LinkedList
- 自定義useState
- 自定義VIEWView
- 自定義SnackBar
- 自定義_ajax
- 專業版即將支援自定義場景測試
- Laravel-自定義全域性函式-ChinaCircle 優化版Laravel函式優化
- vue自定義全域性元件(或自定義外掛)Vue元件
- Android 自定義View:深入理解自定義屬性(七)AndroidView
- 4. 自定義控制元件(4) --- 自定義屬性控制元件
- 自定義JSON名JSON
- Python自定義排序Python排序
- 自定義ORM框架ORM框架
- 自定義異常
- uniapp 自定義 pickerAPP
- 自定義目錄
- SpringBoot自定義StarterSpring Boot
- 自定義註解