Swift 自定义视图:简单的数量选择控件
2017-08-16 22:59
429 查看
学习使用Swift自定义一个简单的视图,传入一个最大值和一个最小值,控件的数字选择和输入范围控制在miniValue和maxValue之间,用于购物模块的数量选择,效果看下图:
1,创建一个view,并完成初始化
2,在view中添加必要的控件(加减按钮和数字显示fieldText)
3,导入第三方库SnapKit布局,这里省去了导入过程
5,加减号的点击事件
6,TextField的代理事件,用来监听和获取当前值,判断是否已到达最大值和最小值,和对手动输入数字的限制(超过或小于限制范围内的处理)
7,以上就是一个简单的数字选择控件,把它添加到VC中看看效果
封装起来就能用了吧
1,创建一个view,并完成初始化
class NumberSelectView: UIView{ override init(frame: CGRect) { super.init(frame: frame) setUpUI() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
2,在view中添加必要的控件(加减按钮和数字显示fieldText)
//减号 fileprivate var minusBtn:UIButton! //加号 fileprivate var plusBtn: UIButton! //数字显示 open var numField:UITextField! // MARK: - 布局 extension NumberSelectView { fileprivate func setUpUI() { //绘制边框 self.layer.borderWidth = 1.0 self.layer.masksToBounds = true self.backgroundColor = UIColor.gray //添加减号按钮 minusBtn = UIButton(type: .custom) minusBtn.setTitle("-", for: .normal) minusBtn.titleLabel?.font = UIFont.systemFont(ofSize: 12.0) minusBtn.setTitleColor(UIColor.gray, for: .normal) minusBtn.backgroundColor = UIColor.white minusBtn.addTarget(self, action: #selector(NumberSelectView.minusNumber), for: .touchUpInside) //添加加号按钮 plusBtn = UIButton(type: .custom) plusBtn.setTitle("+", for: .normal) plusBtn.titleLabel?.font = UIFont.systemFont(ofSize: 12.0) plusBtn.setTitleColor(UIColor.black, for: .normal) plusBtn.backgroundColor = UIColor.white plusBtn.addTarget(self, action: #selector(NumberSelectView.plusNumber), for: .touchUpInside) //添加数字显示 numField = UITextField() numField.textAlignment = .center numField.keyboardType = .numberPad numField.delegate = self numField.backgroundColor = UIColor.white numField.addObserver(self, forKeyPath: "text", options: NSKeyValueObservingOptions(rawValue: 0), context: nil) self.addSubview(minusBtn) self.addSubview(plusBtn) self.addSubview(numField) //位置布局 setUpSunViews() }
3,导入第三方库SnapKit布局,这里省去了导入过程
//子控件布局 fileprivate func setUpSunViews() { minusBtn.snp.makeConstraints { (make) in make.left.equalTo(self) make.top.equalTo(self) make.bottom.equalTo(self) make.width.equalTo(self.frame.size.width/3) } plusBtn.snp.makeConstraints { (make) in make.right.equalTo(self) make.top.equalTo(self) make.bottom.equalTo(self) make.width.equalTo(self.frame.size.width/3) } numField.snp.makeConstraints { (make) in make.top.equalTo(self) make.bottom.equalTo(self) make.left.equalTo(minusBtn.snp.right).offset(1) make.right.equalTo(plusBtn.snp.left).offset(-1) } }4,设置需要的view属性 这里只设置了圆角裁切、边框颜色、背景色、可选最小值、最大值和当前值
//最小值 open var miniValue:String? = "1" { didSet { numField.text = miniValue } } //最大值 open var maxValue:String? = "11" //当前值 open var currentValue:String? { get { return numField.text } } //边框颜色 open var borderColor = UIColor.red { didSet{ self.layer.borderColor = borderColor.cgColor } } //圆角裁切 open var cornerRad = CGFloat() { didSet { self.layer.cornerRadius = cornerRad } }
5,加减号的点击事件
// MARK: - 加减号的点击事件 extension NumberSelectView { //减号事件 @objc func minusNumber() { let currentText = NSString(string: numField.text!) var currentValue: Int = currentText.integerValue if currentText.isEqual(to: "") { numField.text = miniValue return } //减到最小值之后,不能再减 if currentValue == NSString(string: miniValue!).integerValue { return } currentValue-=1 numField.text = "\(currentValue)" } //加号事件 @objc func plusNumber() { let currentText = NSString(string: numField.text!) var currentValue: Int = currentText.integerValue if currentText.isEqual(to: "") { numField.text = miniValue return } currentValue+=1 numField.text = "\(currentValue)" } }
6,TextField的代理事件,用来监听和获取当前值,判断是否已到达最大值和最小值,和对手动输入数字的限制(超过或小于限制范围内的处理)
// MARK: - TextField的代理事件 extension NumberSelectView { override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if numField.text == nil { numField.text = "1" } //遇到最小值 if numField.text == miniValue { minusBtn.setTitleColor(UIColor.gray, for: .normal) minusBtn.isEnabled = false } else { minusBtn.setTitleColor(UIColor.black, for: .normal) minusBtn.isEnabled = true } //遇到最大值 if numField.text == maxValue { plusBtn.setTitleColor(UIColor.gray, for: .normal) plusBtn.isEnabled = false } else { plusBtn.setTitleColor(UIColor.black, for: .normal) plusBtn.isEnabled = true } } //手动输入结束编辑 func textFieldDidEndEditing(_ textField: UITextField) { //结束编辑后的数字小于最小值 或者 大于最大值时,显示最小值(根据需求显示) if textField.text == "" || Int(textField.text!)! <= NSString(string: miniValue!).integerValue || Int(textField.text!)! >= NSString(string: maxValue!).integerValue{ textField.text = miniValue } else if Int(textField.text!)! > 1 { minusBtn.isEnabled = true } } }
7,以上就是一个简单的数字选择控件,把它添加到VC中看看效果
import UIKit class ViewController: UIViewController { var selectView = NumberSelectView.init(frame: CGRect(x: 100, y: 100, width: 100, height: 30)) override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.white selectView.backgroundColor = UIColor.gray selectView.cornerRad = 5 selectView.borderColor = .gray selectView.miniValue = "2" //最小值 selectView.maxValue = "10" //最大值 view.addSubview(selectView) } }
封装起来就能用了吧
相关文章推荐
- 自定义view简单的视图控件,控制view的背景颜色
- Android自定义View 简单实现多图片选择控件
- Android自定义View 简单实现多图片选择控件
- Android自定义View 简单实现多图片选择控件
- rcp(插件开发)CNF 自定义视图-右键菜单-的简单实现
- 富文本(TYAttributedLabel 简单,强大的属性文本控件(无需了解CoreText),支持图文混排显示,支持添加链接,image和UIView控件,支持自定义排版显示)
- zencart分类页每页显示产品数量自定义选择的方法
- 漂亮简单的Android 自定义 Switch 控件!
- 简单实现自定义View控件圆形进度条
- Android自定义组合控件---简单导航栏
- 一个可拖拽,移动,自由组合子控件的视图控件,让开发更简单
- Android 自定义视图容器控件拦截ontouch事件传递给其子控件
- swift IOS 视图控制器 UIButton UILabel 控件使用
- 简单自定义viewpager,小圆点控件
- 【无私分享】干货!!!一个炫酷的自定义日历控件,摆脱日历时间选择烦恼,纯福利~
- 自定义相册多张图片选择并可限制数量
- Android 自定义支持快速搜索筛选的选择控件
- 【自定义视图控件】入门篇----继承View以及主要的函数
- 超级简单的分屏控件【自定义PictureBox 继承于UserControl】
- IOS 自定义下拉选择控件