//
// RadioGroupView.swift
// H56580E2E
//
// Created by 陕西帮你电子科技有限公司 on 2018/12/21.
// Copyright © 2018 DCloud. All rights reserved.
// 单选按钮组
import UIKit
import SwiftyJSON
class RadioGroupView: UIView {
private var radioGroupJSONData = Array<JSON>() //单选框组的数据
private var butAry = Array<UIButton>() //存储所有buttom的数组
public var butWidth:CGFloat = 66
public var butHeight:CGFloat = 32
public var content_x:CGFloat = 10 //每个按钮之间的距离
private var viewY = CGFloat(0)
private var viewX = CGFloat(0)
private var viewWidth = CGFloat(0)
// but 上的字体大小
public var content_titleFont : UIFont = .systemFont(ofSize: 14)
public var butCornerRadius = CGFloat(3) //按钮的圆角
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func settingJSONData(_ dataAryValue:Array<String>){
for i in 0..<dataAryValue.count{
var jsondata = JSON()
if i == 0{
jsondata["is_selected"].boolValue = true
}else{
jsondata["is_selected"].boolValue = false
}
jsondata["value"].stringValue = dataAryValue[i]
jsondata["id"].intValue = i
radioGroupJSONData.append(jsondata)
}
}
func setData(_ dataAryValue:Array<String>){
settingJSONData(dataAryValue)
viewY=self.frame.origin.y
viewX=self.frame.origin.x
viewWidth=self.frame.size.width
var alineButWidth = CGFloat(0) //每一行but的总宽度
var margin_y = CGFloat(10) //最后一个but的y轴位置
var margin_x = CGFloat(content_x) //最后一个but的x轴位置
var current_rect = CGRect() //but位置信息
for i in 0..<dataAryValue.count{
let but = UIButton.init(type: .custom) //定制按钮,前面不带图标,默认文字颜色为白色,无触摸时的高亮效果
//设置默认选中
if radioGroupJSONData[i]["is_selected"].boolValue{
but.isSelected = true
but.backgroundColor = UIColor(hexString: "#FFD440")
}else{
but.isSelected = false
but.backgroundColor = UIColor(hexString: "#747474")
}
but.setTitle(dataAryValue[i], for: .normal)
but.setTitleColor(UIColor(hexString: "#FFFFFF"), for: .normal) //未选中的字体颜色
but.setTitleColor(UIColor(hexString: "#4D3C00"), for: .selected)//选中的字体颜色
but.tag = i //设置 button 的tag
but.layer.cornerRadius = butCornerRadius //设置按钮的圆角
but.addTarget(self, action: #selector(senderEvent), for: .touchUpInside) //设置按钮的点击事件
but.titleLabel?.font = content_titleFont //设置字体大小
//根据字体的大小以及规定的按钮高度来计算按钮的宽度
//let but_width = calcuateLabSizeWidth(str: dataAryValue[i], font:content_titleFont, maxHeight: CGFloat(butHeight)) + 20
//固定宽度
let but_width = butWidth
//计算每个button的 X轴位置 = 每一行but的总宽度 + 每个按钮之间的距离
margin_x = CGFloat(alineButWidth) + CGFloat(content_x)
//计算这一行 but 的总宽度
alineButWidth = CGFloat(content_x) + but_width + CGFloat(alineButWidth)
//判断是否需要换行
if alineButWidth >= self.frame.size.width{
//如果这一行的but总宽度大于等于view的宽度,择将 margin_x和alineButWidth 值初始化
margin_x = CGFloat(content_x)
alineButWidth = margin_x + but_width
//but y 轴的位置 = 上一个but的高 + 上一个but的 y轴位置 + but之间的间距
margin_y = current_rect.size.height + current_rect.origin.y + CGFloat(content_x)
}
//设置 but的位置
but.frame = CGRect(x: margin_x, y: margin_y, width: but_width, height: butHeight)
//临时保存frame,以进行下一次坐标计算
current_rect = but.frame
//将按钮添加到but数组中
butAry.append(but)
self.addSubview(but)
self.frame = CGRect(x: viewX, y: viewY, width: viewWidth, height: margin_y + butHeight)
print("view的预计高度\(margin_y + butHeight)")
print("view的实际高度\(self.frame.size.height)")
}
}
//按钮的点击事件
@objc private func senderEvent(sender : UIButton){
let but_tag = sender.tag
print("当前点击的tag\(but_tag)")
dataInit()
butAry[but_tag].isSelected = true
butAry[but_tag].backgroundColor = UIColor(hexString: "#FFD440")
radioGroupJSONData[but_tag]["is_selected"].boolValue = true
}
//数据初始化
func dataInit(){
for i in 0..<radioGroupJSONData.count{
butAry[i].isSelected = false
butAry[i].backgroundColor = UIColor(hexString: "#747474")
radioGroupJSONData[i]["is_selected"].boolValue = false
}
}
/**
*获取选中的值
*/
func getSelectedValue() -> JSON{
for i in 0..<radioGroupJSONData.count{
if(radioGroupJSONData[i]["is_selected"].boolValue){
return radioGroupJSONData[i]
}
}
return radioGroupJSONData[0]
}
//MARK:---计算文字宽度
private func calcuateLabSizeWidth(str : String, font : UIFont, maxHeight : CGFloat) -> CGFloat{
let attributes = [kCTFontAttributeName: font]
let norStr = NSString(string: str)
let size = norStr.boundingRect(with: CGSize(width: CGFloat(MAXFLOAT), height: maxHeight), options: .usesLineFragmentOrigin, attributes: attributes as [NSAttributedStringKey : Any], context: nil)
return size.width
}
}
使用
class ScreenRightAlertView: BaseAlertView {
//@IBOutlet var radioGroupView: CBGroupAndStreamView!
@IBOutlet var radioGroupView: RadioGroupView!
//开始时间
@IBOutlet var startDateView: UIButton!
//结束时间
@IBOutlet var endDateView: UIButton!
override func initialAlert() {
let contentArr = ["本周","本月","本年"]
//设置数据
radioGroupView.setData(contentArr)
}
}