【纯代码】Swift-自定义PickerView单选(可修改分割线颜色、修改字体大小、修改字体颜色。)(可根据需要自己扩展)
typealias PopPickerViewCallBackClosure = (_ resultStr:NSString?) -> ()
class PopPickerView : UIView
{
var dismissCallBack = {}
var rowAndComponentCallBack:PopPickerViewCallBackClosure? fileprivate var blockContent : NSString? var titleLabel : UILabel?
var divideLine : UIView?
var confirmButton : UIButton?
var cancelButton : UIButton?
var overlayView : UIControl?
var keyWindow : UIWindow? override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = UIColor.white; if (keyWindow == nil) {
self.keyWindow = UIApplication.shared.keyWindow
} overlayView = UIControl.init(frame: UIScreen.main.bounds)
overlayView?.backgroundColor = UIColor.init(red: , green: , blue: , alpha: 0.5)
overlayView?.addTarget(self, action: #selector(hide), for: .touchUpInside)
overlayView?.alpha = let toolView:UIView = UIView.init(frame: CGRect.init(x: , y: , width: Int(self.bounds.size.width), height: Int()))
toolView.backgroundColor = .white
addSubview(toolView) cancelButton = UIButton.init(frame: CGRect.init(x: , y: , width: , height: toolView.bounds.size.height))
cancelButton?.setTitle("取消", for: .normal)
cancelButton?.setTitleColor(newColor(, , ), for: .normal)
cancelButton?.titleLabel?.font = UIFont.systemFont(ofSize: )
cancelButton?.contentHorizontalAlignment = .left
cancelButton?.addTarget(self, action: #selector(cancelAction), for: .touchUpInside)
toolView.addSubview(cancelButton!) confirmButton = UIButton.init(frame: CGRect.init(x: (toolView.bounds.size.width - - ), y: , width: , height: toolView.bounds.size.height))
confirmButton?.setTitle("确定", for: .normal)
confirmButton?.setTitleColor(newColor(, , ), for: .normal)
confirmButton?.titleLabel?.font = UIFont.systemFont(ofSize: )
confirmButton?.contentHorizontalAlignment = .left
confirmButton?.addTarget(self, action: #selector(confirmAction), for: .touchUpInside)
toolView.addSubview(confirmButton!) titleLabel = UILabel.init(frame: CGRect(x: CGFloat(Int(self.bounds.size.width)/ - ), y: , width: , height: toolView.bounds.size.height))
titleLabel?.text = "汽车排量"
titleLabel?.textColor = newColor(, , )
titleLabel?.font = UIFont.systemFont(ofSize: )
titleLabel?.textAlignment = .center
toolView.addSubview(titleLabel!) divideLine = UIView.init(frame: CGRect(x: , y: (confirmButton?.superview?.frame.maxY)!, width: toolView.bounds.size.width, height: ))
divideLine?.backgroundColor = colorWithHexString("0xe5e5e5")
toolView.addSubview(divideLine!)
} convenience init(frame: CGRect,dataSource:NSArray,title:String) {
self.init(frame: frame)
titleLabel?.text = title
if (dataSource.count != ) { let picker = PickerViewBuilder.init(frame: CGRect.init(x: , y: ((confirmButton?.superview?.frame.maxY)! + ), width: UIScreen.main.bounds.size.width - CGFloat(), height: CGFloat()),dataSource:dataSource,contentCallBack:{ [weak self] (resultStr) in
self?.blockContent = resultStr
})
picker.rowAndComponentCallBack = {[weak self](resultStr) in
self?.blockContent = resultStr
} self.addSubview(picker)
}else{
assert(dataSource.count != , "dataSource is not allowed to be nil")
}
} required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
} func show(){
keyWindow?.addSubview(overlayView!)
keyWindow?.addSubview(self)
UIView.animate(withDuration: 0.25, animations: {
self.overlayView?.alpha = 1.0
var frame = self.frame
frame.origin.y = UIScreen.main.bounds.size.height - self.bounds.size.height
self.frame = frame
}) { (isFinished) in
}
} @objc func hide() {
self.dismissCallBack()
UIView.animate(withDuration: 0.25, animations: {
self.overlayView?.alpha =
var frame = self.frame
frame.origin.y = UIScreen.main.bounds.size.height
self.frame = frame
}) { (isFinished) in
self.overlayView?.removeFromSuperview()
self.removeFromSuperview()
}
} @objc func cancelAction() {
hide()
} @objc func confirmAction() {
if blockContent == "" {
showAlert(withTitle: "提示", message: "未选择任何一项!")
}else{
self.rowAndComponentCallBack!(blockContent)
}
hide()
} @objc private func showAlert(withTitle title: String?, message: String?) {
let alertVc = UIAlertController.init(title: title, message: message, preferredStyle: UIAlertController.Style.alert)
alertVc.addAction(UIAlertAction.init(title: "我知道了", style: UIAlertAction.Style.cancel, handler: nil))
UIApplication.shared.keyWindow?.rootViewController?.present(alertVc, animated: true, completion: nil)
}
} class PickerViewBuilder : UIPickerView, UIPickerViewDelegate,UIPickerViewDataSource {
fileprivate var rowAndComponentCallBack:PopPickerViewCallBackClosure?//选择内容回调
lazy var currentSelectRow : NSInteger =
lazy var dataArr = NSMutableArray() override init(frame: CGRect) {
super.init(frame: frame)
} convenience init(frame:CGRect,dataSource:NSArray,contentCallBack:PopPickerViewCallBackClosure?) {
self.init(frame: frame)
self.backgroundColor = UIColor.white
self.dataArr = NSMutableArray.init(array: dataSource)
self.selectedRow(inComponent: )
self.delegate = self
self.dataSource = self
} required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
} func numberOfComponents(in pickerView: UIPickerView) -> Int {
return
} func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return dataArr.count
} func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
//设置分割线
for view in pickerView.subviews {
if view.frame.size.height <= {
view.isHidden = false
view.frame = CGRect(x: , y: view.frame.origin.y, width: UIScreen.main.bounds.size.width, height: )
view.backgroundColor = colorWithHexString("0xe5e5e5")
}
} var pickerLabel = view as? UILabel
if pickerLabel == nil {
pickerLabel = UILabel()
pickerLabel?.textAlignment = .center
if currentSelectRow == row {
pickerLabel?.font = UIFont.systemFont(ofSize: )
pickerLabel?.textColor = newColor(, , )
}else{
pickerLabel?.font = UIFont.systemFont(ofSize: )
pickerLabel?.textColor = newColor(, , )
} }
pickerLabel?.text = dataArr[row] as? String return pickerLabel!
} func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return dataArr[row] as? String
} func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
return
} func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
currentSelectRow = row
rowAndComponentCallBack!(dataArr[currentSelectRow] as? NSString)
self.reloadAllComponents()
}
}
使用:
let pickerView = PopPickerView.init(frame: CGRect(x: , y: UIScreen.main.bounds.size.height, width: UIScreen.main.bounds.size.width, height: ), dataSource: selectParams[indexPath.row - ] as NSArray,title:titleArr[indexPath.row])
pickerView.rowAndComponentCallBack = {(resultStr) in
print(resultStr as Any)
self.currentSelectCell?.rightSelectLabel.text = resultStr! as String
}
pickerView.show()
效果图:

仅限于Component内容,想要多行,可自行扩展。
自定义弹窗、可修改分割线颜色、修改字体大小、修改字体颜色。
【纯代码】Swift-自定义PickerView单选(可修改分割线颜色、修改字体大小、修改字体颜色。)(可根据需要自己扩展)的更多相关文章
- Android之hint提示字体大小修改,显示完全
Android之hint提示字体大小修改,显示完全 1.工作中遇到一个问题,就是自定义EditText的hint提示在超大字体下会显示不全, 2.然后在网上搜索了一下,在这里记录一下,分享给大家,在此 ...
- eclipse中文字体大小修改
貌似有不少人苦恼eclipse中文字体大小修改问题,默认的eclipse中文字体很小,和英文字体大小完全不在一个调子上,因为默认的eclipse juno中英文字体是Consolas,字体大小是10, ...
- eclipse中文字体大小修改,让中英文字体协调
貌似有不少人苦恼eclipse中文字体大小修改问题,默认的eclipse中文字体很小,和英文字体大小完全不在一个调子上,因为默认的eclipse juno中英文字体是Consolas,字体大小是10, ...
- Sublime Text3自定义全部字体大小、字体类型和背景颜色
一.定义侧栏的背景颜色.字体大小和间距 Sublime Text3的Afterglow主题链接为:https://github.com/YabataDesign/afterglow-theme 1.按 ...
- Flash Builder 4.6/4.7 注释以及字体大小修改
①修改字体颜色.粗体.斜体.下划线 英文版:windows-preferences-flex-editors-syntex coloring-ActionScript-Comment 汉化版:窗口—首 ...
- Android代码中设置字体大小,字体颜色,显示两种颜色.倒计时效果
Android代码中设置字体大小,字体颜色,显示两种颜色 在xml文件中字体大小用的像素 <TextView android:id="@+id/uppaid_time" an ...
- css 修改placeholder字体颜色字体大小 修改input记住账号密码后的默认背景色
壹 ❀ 引 本来这个阶段的项目页面都是给实习生妹子做的,我只用写写功能接接数据,但这两天妹子要忙翻译,这个工作阶段也快结束了导致有点慌,只能自己把剩余的几个小页面给写了. 那么做页面的过程中,UI也 ...
- qt 5 小练习 纯代码制作自定义按钮
大家都知道QT设计师中直接拖动的按钮是长方形带有圆角的图案,那我们如何来设置自定义按钮呢 要设计一个按钮,我们必须要知道按钮有什么属性,首先,按钮必须有一个位置 第二,按钮必须有一个名称.还有当我们点 ...
- Unity 同一Text文本修改不同的字体大小和字体颜色
类似Html,在color和size对应的<>str</>中,就能修改str的相关属性, 下面的代码就是把time改为字体颜色为红色,大小为40: 而前面的"Time ...
- 字体大小和背景颜色修改--Android Studio
打开: File/seting/Editor/colors&Fonts/Fonts editor Font处默认的不让修改 所以先点击save as 随便点个名字 然后 size就可以修改了
随机推荐
- Python使用函数实现把字符串转换成整数
需求:假设Python没有提供内置函数int如果使用函数方式实现把一串字符串转换成整数例如把字符串‘12345‘转换成整数12345 思路 1,字符串也是序列可以使用map函数处理分割成一个列表 2, ...
- hdu4686 简单的矩阵快速幂求前n项和
HDU4686 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4686 题意:题目说的很清楚了,英语不好的猜也该猜懂了,就是求一个表达式的前n项和,矩阵 ...
- mysql IPv4 IPv6
w如何通过一个mysql方法,而不是借助脚本判断?INET6_ATON(expr) https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-func ...
- If a cache file exists, it is sent directly to the browser, bypassing the normal system execution.
w开启缓存,缓存视图,用于后续请求. https://www.codeigniter.com/userguide3/overview/appflow.html http://codeigniter.o ...
- nodejs(三)下之mangoDB
mongoDB 简介 一.什么是MongoDB ? 1.MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能. 2.Mo ...
- PHP file_get_contents和curl区别
一.file_get_contents 1.定义 file_get_contents() 函数将指定 URL 的文件读入一个字符串并返回. 2.语法 file_get_contents(path, i ...
- PHP webservice 的初接触
webservice 现在是开始流行了,很多业务开启了这个功能.去年接触的一个金融类的项目有类似功能调用.当时没放心思研究,最两天试着接触了下,还真不错的.起步其实挺简单. 服务端的代码 server ...
- 如何使文本溢出边界不换行强制在一行内显示?#test{width:150px;white-space:nowrap;}
#test{width:150px;white-space:nowrap;}
- 为什么说”人生苦短,我用python“?
本文不扯什么大道理,只是先介绍Python的背景,然后从实用的角度出发举一两个真实栗子. 首先要想了解要一门语言的好坏,或者为什么招程序员喜欢(卧槽,原来程序员喜欢不是女朋友?)我们的先从语言的产 ...
- C的指针疑惑:C和指针8数组
]; ]; 上面申明两个数组,不能进行以下赋值 b = a; 你不能使用赋值符把一个数组的所有元素复制给另一个数组,必须使用一个循环,每次复制一个元素 数组和指针 ]; int *b; 声明一个数组, ...