Swift自定义RadioGroupView

本文介绍如何在Swift中创建一个自定义的RadioGroupView,详细讲解了实现过程和关键代码,帮助开发者理解自定义UI组件的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

//
//  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)
    }
    
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值