想练练手,所以封装了一个两种选择星星的评价样式的Demo,并且可以获取到点击的星星的索引值,方便记录值,上传数据时使用

首先创建View类,设计初始化方法,并且用到了枚举类型和代理方法

方式一:默认的有文字的5颗星评价的样式

case .TextType://有文字样式
            
            //计算每个星星的大小宽、高
            let itemWidthF:CGFloat = viewWidthF / 5.0
            let itemHeightF:CGFloat = viewHeightF / 2.0
            //将小的值赋值给星星
            let starWidth:CGFloat = 30.0;
            let textArr:NSArray = ["很差","凑合","一般","不错","完美"]
            
            //创建按钮和星星
            for i in 0...4 {
                let starImgV = UIImageView.init(frame: CGRect.init(x: (itemWidthF-starWidth)/2+itemWidthF*CGFloat(i), y: (itemHeightF-starWidth)/2, width: starWidth, height: starWidth))
                starImgV.tag = i+100
                starImgV.image = UIImage.init(named: "StarUnSelect")
                self.addSubview(starImgV)
                
                let butt = UIButton.init(frame: CGRect.init(x: itemWidthF*CGFloat(i), y: 0, width: itemWidthF, height: itemHeightF));
                butt.tag = i+200
                butt.addTarget(self, action: #selector(buttClick), for: UIControlEvents.touchUpInside)
                self.addSubview(butt)
                
                let textLabel = UILabel.init(frame: CGRect.init(x: itemWidthF*CGFloat(i), y: itemHeightF, width: itemWidthF, height: itemHeightF))
                textLabel.text = textArr[i] as? String
                textLabel.adjustsFontSizeToFitWidth = true
                textLabel.textColor = UIColor.lightGray
                textLabel.font = UIFont.systemFont(ofSize: 13)
                textLabel.textAlignment = NSTextAlignment.center;
                self.addSubview(textLabel)
            }
            
            break

方式二:没有文字描述的评价程度,同时要注意视图的宽高大小问题

case .NoTextType:
            //无文字样式
            //计算每个星星的大小宽、高
            let itemWidthF:CGFloat = viewWidthF / CGFloat(aNum)
            let itemHeightF:CGFloat = viewHeightF
            //设置星星的大小
            var starWidth:CGFloat = 0.0
            if itemWidthF>30 {
                //如果大于,保持大小为30
                starWidth = 30
                //创建按钮和星星
                for i in 0...aNum-1 {
                    let starImgV = UIImageView.init(frame: CGRect.init(x: (itemWidthF-starWidth)/2+itemWidthF*CGFloat(i), y: (itemHeightF-starWidth)/2, width: starWidth, height: starWidth))
                    starImgV.tag = i+100
                    starImgV.image = UIImage.init(named: "StarUnSelect")
                    self.addSubview(starImgV)
                    
                    let butt = UIButton.init(frame: CGRect.init(x: itemWidthF*CGFloat(i), y: 0, width: itemWidthF, height: itemHeightF));
                    butt.tag = i+200
                    butt.addTarget(self, action: #selector(buttClick), for: UIControlEvents.touchUpInside)
                    self.addSubview(butt)
                    
                }
            }else{
                //如果小于,判断宽、高的大小,将小的值赋值给星星
                //三目运算
                //starWidth = itemWidthF<itemHeightF ? itemWidthF:itemHeightF
                
                if itemWidthF<=itemHeightF {
                    //如果宽小于高
                    starWidth = itemWidthF
                    //创建按钮和星星
                    for i in 0...aNum-1 {
                        let starImgV = UIImageView.init(frame: CGRect.init(x: starWidth*CGFloat(i), y: (itemHeightF-starWidth)/2, width: starWidth, height: starWidth))
                        starImgV.tag = i+100
                        starImgV.image = UIImage.init(named: "StarUnSelect")
                        self.addSubview(starImgV)
                        
                        let butt = UIButton.init(frame: CGRect.init(x: starWidth*CGFloat(i), y: 0, width: starWidth, height: itemHeightF));
                        butt.tag = i+200
                        butt.addTarget(self, action: #selector(buttClick), for: UIControlEvents.touchUpInside)
                        self.addSubview(butt)
                    }
                }else{
                    //如果宽大于高
                    starWidth = itemHeightF
                    //创建按钮和星星
                    for i in 0...aNum-1 {
                        let starImgV = UIImageView.init(frame: CGRect.init(x: (itemWidthF-starWidth)/2+itemWidthF*CGFloat(i), y: 0, width: starWidth, height: starWidth))
                        starImgV.tag = i+100
                        starImgV.image = UIImage.init(named: "StarUnSelect")
                        self.addSubview(starImgV)
                        
                        let butt = UIButton.init(frame: CGRect.init(x: itemWidthF*CGFloat(i), y: 0, width: itemWidthF, height: itemHeightF));
                        butt.tag = i+200
                        butt.addTarget(self, action: #selector(buttClick), for: UIControlEvents.touchUpInside)
                        self.addSubview(butt)
                    }
                }
            }
            
            break

设计代理方法,并实现

//定义协议,知道点击的哪一个
protocol BHClickMarkStarDelegate:NSObjectProtocol{
    
    //定义一个可以记录显示的哪颗星星的方法
    func clickWhichStar(bhMarkView:BHMarkStarView,indexNum:Int)
    
}

//实现协议方法
    func clickWhichStar(bhMarkView: BHMarkStarView, indexNum: Int) {
        switch bhMarkView.tag {
        case 1:
            print("输出的是第。。。一。。。个视图的第...\(indexNum+1)...个星星")
            break
        case 2:
            print("输出的是第。。。二。。。个视图的第...\(indexNum+1)...个星星")
            break
        case 3:
            print("输出的是第。。。三。。。个视图的第...\(indexNum+1)...个星星")
            break
        case 10:
            print("输出的是第。。。四。。。个视图的第...\(indexNum+1)...个星星")
            break
        case 11:
            print("输出的是第。。。五。。。个视图的第...\(indexNum+1)...个星星")
            break
        case 12:
            print("输出的是第。。。六。。。个视图的第...\(indexNum+1)...个星星")
            break
        default:
            break
        }
    }

效果图:(源码下载:https://github.com/hbblzjy/SwiftMarkStartDemo

    

Swift基础之两种选择星星的评价样式并获取星星的索引值的更多相关文章

  1. 【Swfit】Swift与OC两种语法写单例的区别

    Swift与OC两种语法写单例的区别 例如写一个NetworkTools的单例 (1)OC写单例 + (instancetype)sharedNetworkTools { static id inst ...

  2. 运算符关键字。数据区别大小写。日期范围。判空的两种写法。NOT IN的两种写法。IN范围可含NULL,但NOT IN值范围不能含NULL。

    比较:>,<,=,>=,<=,<>(!=) 逻辑:AND,OR,NOT 范围:BETWEEN...AND... 范围:IN,NOT IN 判空:IS NULL, I ...

  3. JAVA基础之两种核心机制

    突然之间需要学习Java,学校里学的东西早就忘记了,得用最短的时间把Java知识理顺,重点还是J2EE,毕竟所有的ava项目中95%都是J2EE,还是先从基础的J2SE学起吧....... 首先是了解 ...

  4. Thead基础及两种创建方式

    今天本人给大家讲解一下多线程,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!! 说说多线程本人自己对它理解的定义:因计算机的CPU支持能够在同一时间执行多于一 ...

  5. iOS 获取版本号(Swift和OC两种)

    iOS获取应用版本号:version OC: [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVers ...

  6. Swift基础之两指拉动图片变大变小

    我们在使用APP的时候,有时会发现有些图片可以通过两指进行放大.缩小,今天就实现这样的一种效果,比较简单,不喜勿喷.... var imageVi:UIImageView! = nil    var ...

  7. javascript基础之两种函数的定义方法

    第一种方式:可以在函数定义之前调用也可以在函数定义之后调用: (0)函数的调用 add(,) //可以调用 (1)函数的定义: function add(x,y) { console.log(x+y) ...

  8. git代码回滚的两种选择

    回滚到指定commit,且保持该commit之前和之后的提交记录 使用git revert命令. git revert HEAD // 回滚到前一次 commit git revert HEAD^ / ...

  9. [Swift]二分法的两种方式

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

随机推荐

  1. Linux服务器断电导致挂载及xfs文件损坏的修复方法

    系统文件损坏后进入紧急修复模式,无法进行维护工作 welcome to emergency mode!after logging in ,type "journalctl -xb" ...

  2. Hibernate--对象关系

    在hibernate中,关联关系映射分为单向关联和双向关联.共有七种关系 ·@Many To One ·@One To Many(单向) ·@One To Many(多向) ·@One To One( ...

  3. [Luogu 3674]小清新人渣的本愿

    Description 题库链接 给你一个序列 \(A\) ,长度为 \(n\) ,有 \(m\) 次操作,每次询问一个区间是否可以 选出两个数它们的差为 \(x\) : 选出两个数它们的和为 \(x ...

  4. [USACO 08JAN]Haybale Guessing

    Description The cows, who always have an inferiority complex about their intelligence, have a new gu ...

  5. [Luogu 3414]SAC#1 - 组合数

    Description 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌! 今天他萌上了组合数.现在他很想知道simga(C(n,i))是多少:其中C是组合数(即C(n,i)表示n个物品无顺序选取i个的方案 ...

  6. Passward

    问题 A: Passward 时间限制: 1 Sec  内存限制: 512 MB 题目描述 你来到了一个庙前,庙牌上有一个仅包含小写字母的字符串 s. 传说打开庙门的密码是这个字符串的一个子串 t,并 ...

  7. 【 lca倍增模板】

    题目描述 对于 n(<100000)个点 n-1 条掉权值的边,有 m 个询问,每条询问求两个结点之间的路径上边权的最小值 输入 第一行 n,表示结点个数,接下来 n-1 行,每行 a b w ...

  8. Codeforces Round #404 (Div. 2)

    好久没打CF了,打场div2练手.因为比较晚还没提前睡有点神志不清,E题打了莫名其妙的代码调了好久,最后结束后5分钟才发现哪里错了-- AC:ABCD Rank:60 A.Anton and Poly ...

  9. [bzoj4874]筐子放球

    来自FallDream的博客,未经允许,请勿转载,谢谢. 小N最近在研究NP完全问题,小O看小N研究得热火朝天,便给他出了一道这样的题目: 有 n 个球,用整数 1 到 n 编号.还有 m 个筐子,用 ...

  10. bzoj4710: [Jsoi2011]分特产 组合+容斥

    4710: [Jsoi2011]分特产 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 289  Solved: 198[Submit][Status] ...