swift 简单封装的一个五星评分器

前端之家收集整理的这篇文章主要介绍了swift 简单封装的一个五星评分器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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)
        }
    }

}

猜你在找的Swift相关文章