Swift基础之两种选择星星的评价样式并获取星星的索引值
想练练手,所以封装了一个两种选择星星的评价样式的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基础之两种选择星星的评价样式并获取星星的索引值的更多相关文章
- 【Swfit】Swift与OC两种语法写单例的区别
Swift与OC两种语法写单例的区别 例如写一个NetworkTools的单例 (1)OC写单例 + (instancetype)sharedNetworkTools { static id inst ...
- 运算符关键字。数据区别大小写。日期范围。判空的两种写法。NOT IN的两种写法。IN范围可含NULL,但NOT IN值范围不能含NULL。
比较:>,<,=,>=,<=,<>(!=) 逻辑:AND,OR,NOT 范围:BETWEEN...AND... 范围:IN,NOT IN 判空:IS NULL, I ...
- JAVA基础之两种核心机制
突然之间需要学习Java,学校里学的东西早就忘记了,得用最短的时间把Java知识理顺,重点还是J2EE,毕竟所有的ava项目中95%都是J2EE,还是先从基础的J2SE学起吧....... 首先是了解 ...
- Thead基础及两种创建方式
今天本人给大家讲解一下多线程,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!! 说说多线程本人自己对它理解的定义:因计算机的CPU支持能够在同一时间执行多于一 ...
- iOS 获取版本号(Swift和OC两种)
iOS获取应用版本号:version OC: [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVers ...
- Swift基础之两指拉动图片变大变小
我们在使用APP的时候,有时会发现有些图片可以通过两指进行放大.缩小,今天就实现这样的一种效果,比较简单,不喜勿喷.... var imageVi:UIImageView! = nil var ...
- javascript基础之两种函数的定义方法
第一种方式:可以在函数定义之前调用也可以在函数定义之后调用: (0)函数的调用 add(,) //可以调用 (1)函数的定义: function add(x,y) { console.log(x+y) ...
- git代码回滚的两种选择
回滚到指定commit,且保持该commit之前和之后的提交记录 使用git revert命令. git revert HEAD // 回滚到前一次 commit git revert HEAD^ / ...
- [Swift]二分法的两种方式
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
随机推荐
- thinkjs升级到3.0后的图片上传
似乎当thinkjs升级到3.0后,才接手了一个项目.只是在实际运用过程中,还是发现了与2.2的些许差别——今天先分享关于图片上传的一些问题. 1.上传文件,我们选择了jQuery的插件:http:/ ...
- Java面试题—初级(5)
41.a.hashCode() 有什么用?与 a.equals(b) 有什么关系? hashCode() 方法对应对象整型的 hash 值.它常用于基于 hash 的集合类,如 Hashtable.H ...
- 简述ConCurrentHashMap
HashMap: 从JDK1.2起,就有了HashMap,HashMap不是线程安全的,多线程操作时需要注意. CurrentHashMap: 在JDK1.5中,引入concurrent包,从此Map ...
- 小工具:批量导入导出主机上的docker镜像
工作需要,将主机上的部分镜像导出为tar文件,放便在其他主机上使用 用python实现了一个批量打包脚本: import re import os import subprocess if __nam ...
- window.location各属性含义
window.location方法获取URL 统一资源定位符 (Uniform Resource Locator, URL) 完整的URL由这几个部分构成: scheme://host:p ...
- 下载python的Crypto库出现的问题的解决:ModuleNotFoundError: No module named 'Crypto'
在网上找了很多下载Crypto的方法,感觉作用都不算很大,然后自己瞎搞瞎搞就搞好了
- [HNOI 2017]礼物
Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在 ...
- codeforces 815C Karen and Supermarket
On the way home, Karen decided to stop by the supermarket to buy some groceries. She needs to buy a ...
- poj 1755 半平面交+不等式
Triathlon Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6461 Accepted: 1643 Descrip ...
- 【UVA–11997 K Smallest Sums 】
·哦,这题要用优先队列?那大米饼就扔一个手写堆上去吧! ·英文题,述大意: 输入n个长度为n的序列(题中是k,2<=k<=750).一种结果定义为:从每个序列中都要挑选一个数加 ...