iOS知识点iOS 开发每天分享优质文章iOS进阶

iOS星级评分效果实现

2016-07-07  本文已影响1290人  JerryLMJ

在开发中我们经常需要实现评价星级的功能,这里分享一个评星效果的实现过程。

效果:

Demo地址:https://github.com/MajorLMJ/LMJGradeStarsControl
如果此demo帮助到你,请赐给一颗star,你的鼓励是我coding的动力

具体实现:

@implementation LMJGradeStarsControl
{
    NSInteger _defaultIndex;
    NSInteger _totalStars;
    CGFloat   _size;
    
    NSMutableArray * _starsBtnArr;
}

- (id)initWithFrame:(CGRect)frame totalStars:(NSInteger)totalStars starSize:(CGFloat)size{
    self = [self initWithFrame:frame defaultSelectedStatIndex:(LMJGradeStarsControlStartIndex-1) totalStars:totalStars starSize:size];
    return self;
}

- (id)initWithFrame:(CGRect)frame defaultSelectedStatIndex:(NSInteger)index totalStars:(NSInteger)totalStars starSize:(CGFloat)size{
    self = [super initWithFrame:frame];
    _defaultIndex = index;
    _totalStars   = totalStars;
    _size         = size;
    
    if (self) {
        _starsBtnArr = [NSMutableArray array];
        [self buildStars];
    }
    return self;
}


- (void)buildStars{
    CGFloat starDistance = self.frame.size.width / (_totalStars +1);
    
    int i = 0;
    
    for (int index = LMJGradeStarsControlStartIndex; index < (LMJGradeStarsControlStartIndex +_totalStars); index++) {
        
        UIButton * starBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        [starBtn setFrame:CGRectMake(0, 0, _size +10, _size +10)];
        [starBtn setCenter:CGPointMake(starDistance * (i+1), self.frame.size.height/2)];
        [starBtn setBackgroundColor:[UIColor clearColor]];
        if (index <= _defaultIndex) {
            [starBtn setImage:[UIImage imageNamed:@"star_on"] forState:UIControlStateNormal];
            [starBtn setImage:[UIImage imageNamed:@"star_on"] forState:UIControlStateHighlighted];
        }else{
            [starBtn setImage:[UIImage imageNamed:@"star_off"] forState:UIControlStateNormal];
            [starBtn setImage:[UIImage imageNamed:@"star_off"] forState:UIControlStateHighlighted];
        }
        
        [starBtn setImageEdgeInsets:UIEdgeInsetsMake(5, 5, 5, 5)];
        [starBtn setTag:index];
        [starBtn setHighlighted:NO];
        [starBtn addTarget:self action:@selector(clickStarBtn:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:starBtn];
        
        [_starsBtnArr addObject:starBtn];
        
        i++;
    }
}


- (void)clickStarBtn:(UIButton *)button{
    [self clickStarBtnActionWithBtnTag:button.tag];
}

- (void)clickStarBtnActionWithBtnTag:(NSInteger)tag{
    for (int i = 0; i < _starsBtnArr.count; i++) {
        UIButton * btn = _starsBtnArr[i];
        
        if (btn.tag <= tag) {
            [btn setImage:[UIImage imageNamed:@"star_on"] forState:UIControlStateNormal];
            [btn setImage:[UIImage imageNamed:@"star_on"] forState:UIControlStateHighlighted];;
        }else{
            [btn setImage:[UIImage imageNamed:@"star_off"] forState:UIControlStateNormal];
            [btn setImage:[UIImage imageNamed:@"star_off"] forState:UIControlStateHighlighted];
        }
    }
    
    if ([self.delegate respondsToSelector:@selector(gradeStarsControl:selectedStars:)]) {
        [self.delegate gradeStarsControl:self selectedStars:(tag)];
    }
}

- (void)setSelectedStarIndex:(NSUInteger)index{
    [self clickStarBtnActionWithBtnTag:index];
}

Demo地址:
https://github.com/MajorLMJ/LMJGradeStarsControl
如果此demo帮助到你,请赐给一颗star,你的鼓励是我coding的动力

版权声明:出自MajorLMJ技术博客的原创作品 ,转载时必须注明出处及相应链接!

上一篇 下一篇

猜你喜欢

热点阅读