想练练手,所以封装了一个两种选择星星的评价样式的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. 【Android学习笔记】布局的简单介绍

    我在学习Android开发的时候是基于实战项目的,基础理论知识以前也是零散的看过一些,个人还是觉得边做项目边学要快些.现在做的这个项目iOS端是我做的,这样逻辑什么的都很熟悉,于我而言换个平台也只是换 ...

  2. linux必知必会命令

  3. 删数方案数(regex)

    [题目描述] 给出一个正整数序列 a,长度为 n,cyb 不喜欢完美,他要删掉一些数(也可以不删,即删掉0个),但是他不会乱删,他希望删去以后,能将 a 分成 2 个集合,使得两个非空集合的数的和相同 ...

  4. 洛谷P3209 [HNOI2010]PLANAR

    首先用一波神奇的操作,平面图边数m<=3*n-6,直接把m降到n, 然后对于冲突的边一条环内,一条环外,可以用并查集或者2Sat做, 当然并查集是无向的,2Sat是有向的,显然用并查集比较好 复 ...

  5. 例10-10 uva10491(简单概率)

    题意: 在a+b扇门,a扇后面是牛,b扇后面是车.在你选择一扇门后,主持人为你打开另外c扇门,然后你再选一扇, 求是车的概率 ①先选牛:a/(a+b),然后还剩a+b-c-1扇门,其中b扇为车,所以a ...

  6. 提高Mysql查询速度的一些建议(转).

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  7. Windows提示dll组件丢失

    我们在运行一些软件时,常常会遇到这种问题.下面就来提供解决办法: 登陆网址:www.dll-files.com. 找到页面的搜索部分,并且进行相关搜索: 下图显示了相关的dll下载链接. 下载解压即可 ...

  8. Unique-paths (动态规划)

    题目描述 A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below) ...

  9. 【docker简易笔记】docker基础信息的分享

    docker 使用的频率越来越高,所以在后续的一些博客中会分享一些docker的安装和使用. 一.docker介绍   "Docker 最初是 dotCloud 公司创始人 Solomon ...

  10. Vegas Pro 15软件界面对比

    大家都知道Vegas是一款专业的视频制作软件,而新版的VEGAS Pro 15更是专业性十足.好了,废话不多说,接下来小编就带大家具体的看一下Vegas 15界面都有哪些更新吧! 一.软件图标 图1: ...