swift 封装的一个五星评分器,可以用于单纯展示评分,也可以用来手动打分。
gitHub地址:https://github.com/NinoWang/RatingBar
import UIKit protocol RatingBarDelegate { func ratingChanged(ratingBar:RatingBar,newRating:Float) } class RatingBar: UIView { var delegate:RatingBarDelegate? var starRating:Float? var lastRating:Float? var starWidth:CGFloat? var starHeight:CGFloat? var unSelectedImage:UIImage? var halfSelectedImage:UIImage? var fullSelectedImage:UIImage? var s1:UIImageView? var s2:UIImageView? var s3:UIImageView? var s4:UIImageView? var s5:UIImageView? //是否是指示器 var isIndicator:Bool = false func setseletedState(deselectedName:String?,halfSelectedName:String?,fullSelectedName:String?,starSideLength:CGFloat,delegate:RatingBarDelegate){ self.delegate = delegate unSelectedImage = UIImage(named: deselectedName!) fullSelectedImage = UIImage(named: fullSelectedName!) halfSelectedImage = halfSelectedName == nil ? fullSelectedImage:UIImage(named: halfSelectedName!) starWidth = 0 starHeight = 0 if (starHeight < starSideLength) { starHeight = starSideLength } if (starWidth < starSideLength) { starWidth = starSideLength } //控件宽度适配 var frame = self.frame var viewWidth:CGFloat = starWidth! * 5 if (frame.size.width) > viewWidth { viewWidth = frame.size.width } frame.size.width = viewWidth self.frame = frame starRating = 0 lastRating = 0 s1 = UIImageView(image: unSelectedImage) s2 = UIImageView(image: unSelectedImage) s3 = UIImageView(image: unSelectedImage) s4 = UIImageView(image: unSelectedImage) s5 = UIImageView(image: unSelectedImage) //星星间距 let space:CGFloat = (viewWidth - starWidth!*5)/6 var starX = space let starY = (frame.height - starHeight!)/2 s1?.frame = CGRectMake(starX,starY,starWidth!,starHeight!) starX = starX + starWidth! + space s2?.frame = CGRectMake(starX,starHeight!) starX = starX + starWidth! + space s3?.frame = CGRectMake(starX,starHeight!) starX = starX + starWidth! + space s4?.frame = CGRectMake(starX,starHeight!) starX = starX + starWidth! + space s5?.frame = CGRectMake(starX,starHeight!) starX = starX + starWidth! + space s1?.userInteractionEnabled = false s2?.userInteractionEnabled = false s3?.userInteractionEnabled = false s4?.userInteractionEnabled = false s5?.userInteractionEnabled = false self.addSubview(s1!) self.addSubview(s2!) self.addSubview(s3!) self.addSubview(s4!) self.addSubview(s5!) } //设置评分值 func displayRating(rating:Float){ s1?.image = unSelectedImage s2?.image = unSelectedImage s3?.image = unSelectedImage s4?.image = unSelectedImage s5?.image = unSelectedImage if (rating >= 1) { s1?.image = halfSelectedImage } if (rating >= 2) { s1?.image = fullSelectedImage } if (rating >= 3) { s2?.image = halfSelectedImage } if (rating >= 4) { s2?.image = fullSelectedImage } if (rating >= 5) { s3?.image = halfSelectedImage } if (rating >= 6) { s3?.image = fullSelectedImage } if (rating >= 7) { s4?.image = halfSelectedImage } if (rating >= 8) { s4?.image = fullSelectedImage } if (rating >= 9) { s5?.image = halfSelectedImage } if (rating >= 10) { s5?.image = fullSelectedImage } starRating = rating lastRating = rating delegate?.ratingChanged(self,newRating: rating) } func rating() -> Float{ return starRating! } //手势 override func touchesBegan(touches: Set<UITouch>,withEvent event: UIEvent?) { super.touchesBegan(touches,withEvent: event) } override func touchesEnded(touches: Set<UITouch>,withEvent event: UIEvent?) { super.touchesEnded(touches,withEvent: event) self.touchesRating(touches) } override func touchesMoved(touches: Set<UITouch>,withEvent event: UIEvent?) { super.touchesMoved(touches,withEvent: event) self.touchesRating(touches) } //触发 func touchesRating(touches:NSSet){ if(self.isIndicator == false){ return } let point:CGPoint = touches.anyObject()!.locationInView(self) let space:CGFloat = (self.frame.size.width - starWidth!*5)/6 var newRating:Float = 0 if (point.x >= 0 && point.x <= self.frame.size.width) { if (point.x <= space+starWidth!*0.5) { newRating = 1; }else if (point.x < space*2+starWidth!){ newRating = 2; }else if (point.x < space*2+starWidth!*1.5){ newRating = 3; }else if (point.x <= 3*space+2*starWidth!){ newRating = 4; }else if (point.x <= 3*space+2.5*starWidth!){ newRating = 5; }else if (point.x <= 4*space+3*starWidth!){ newRating = 6; }else if (point.x <= 4*space+3.5*starWidth!){ newRating = 7; }else if (point.x <= 5*space+4*starWidth!){ newRating = 8; }else if (point.x <= 5*space+4.5*starWidth!){ newRating = 9; }else { newRating = 10; } } if (newRating != lastRating){ self.displayRating(newRating) } } }