Swift-分段选择View
2018-11-19 本文已影响49人
SK丿希望
前言
因为项目中经常用到,直接一直用被人的,开发基本需求可以满足,但是当内容需要改变是那就蛋疼了, 下面介绍的是一个可以通过刷新来改变文字内容的滚动选项view,使用也比较简单
基本需求
image.png
需要改变
image.png
介绍
- 可修改样式
class HWTitleStyle: NSObject {
/// 默认颜色
var normalColor: UIColor = .black//UIColor(r: 0, g: 0, b: 0)
/// 选中颜色
var selectColor: UIColor = .orange//UIColor(r: 255, g: 127, b: 0)
/// 文字大小
var fontSize: CGFloat = 15.0
/// 移动高度
var mobileLineHeight: CGFloat = 2
/// 移动线颜色
var mobileLineColor: UIColor = .orange
/// 是否显示移动线
var isShowMobileLine: Bool = true
/// 额外间距
var itemMargin: CGFloat = 30
/// 底部高度
var bottomLineHeight: CGFloat = 0.5
/// 底部线颜色
var bottomLineColor: UIColor = .lightGray
/// 是否显示底部线
var isShowBottomLine: Bool = true
}
- 创建方法
/// 默认样式 可以后期修改样式
init(frame: CGRect)
/// 带样式创建
init(frame: CGRect, style: HWTitleStyle? = nil)
- 点击事件监听
/// 代理方法
@objc optional func titleVie(_ titleVie: HWTitleView, index: Int)
/// 点击label的block回调
var clickIndexBlock:((Int)->())?
- 数据源方法
/// 返回个数
func numberOfItems(in titleView: HWTitleView) -> Int
/// 返回当前需要显示的文字
func titleView(_ titleView: HWTitleView, titleForItemAt index: Int) -> String?
使用案例:
-
基本显示
- 创建
/// 创建
var titles = ["全部", "待付款", "待发货" ,"待收货", "待评论", "退款/换货"]
override func viewDidLoad() {
super.viewDidLoad()
let titleView = HWTitleView.init(frame: CGRect.init(x: 0, y: 64, width: view.bounds.width, height: 44))
titleView.dataSource = self
titleView.backgroundColor = UIColor.white
view.addSubview(titleView)
}
- 2.实现数据源方法
extension ViewController : HWTitleViewDataSource {
/// 返回个数
func numberOfItems(in titleView: HWTitleView) -> Int {
return titles.count
}
/// 返回对应的文本
func titleView(_ titleView: HWTitleView, titleForItemAt index: Int) -> String? {
return titles[index]
}
}
-
更多使用(修改样式及修改文字内容)
1.监听点击的Label 可以通过代理方法
func titleVie(_ titleVie: HWTitleView, index: Int)
与闭包clickIndexBlock:((Int)->())
来实现
2.修改内容只要reloadData()
刷新布局,然后在数据方法中进行对应操作即可
class ViewController: UIViewController {
var titles = ["全部", "待付款", "待发货" ,"待收货", "待评论", "退款/换货"]
var titleView: HWTitleView?
override func viewDidLoad() {
super.viewDidLoad()
let titleView = HWTitleView.init(frame: CGRect.init(x: 0, y: 64, width: view.bounds.width, height: 44))
titleView.dataSource = self
titleView.delegate = self
/// 闭包回调当前点击的角标
titleView.clickIndexBlock = { (index) in
print(index)
}
titleView.backgroundColor = UIColor.white
self.titleView = titleView
view.addSubview(titleView)
}
var tag = 1
/// 通过touchesBegan 模拟修改样式与文本内容
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let style = HWTitleStyle()
if tag == 1 {
style.normalColor = UIColor.black
style.selectColor = UIColor.red
style.mobileLineColor = UIColor.red
style.isShowBottomLine = false
tag = 2
} else {
tag = 1
}
/// 刷新样式
titleView?.refreshStyle(style)
/// 刷新布局
titleView?.reloadData()
}
}
extension ViewController : HWTitleViewDataSource {
/// 返回个数
func numberOfItems(in titleView: HWTitleView) -> Int {
return titles.count
}
/// 返回对应的文本
func titleView(_ titleView: HWTitleView, titleForItemAt index: Int) -> String? {
return titles[index] + (tag == 2 ? String(format: "(%ld)", index) : "")
}
}
extension ViewController : HWTitleViewDelegate {
/// 代理回调当前点击的角标
func titleVie(_ titleVie: HWTitleView, index: Int) {
print(index)
}
}