iOS星星评分两种方式

样式1

星星样式1.png
  • 我们要做的就是图片上的5颗星星
  1. 根据分数判断我们该添加什么样式的星星
 - (void)setLevel:(CGFloat)level{
 _level = level;
    //1.满星  
    NSInteger fullStarCount = (NSInteger)level;
    for (NSInteger i = 0; i < fullStarCount; i++) {
        //添加满星
        [self makeStarViewWithImageName:@"full_star" startPosition:i];
        
    }
    //2.半星   
    if (level - fullStarCount) {
        
        [self makeStarViewWithImageName:@"half_star" startPosition:fullStarCount];
        //统计星星目前个数(满星+半星)
        fullStarCount ++;
    }
     //3.空星
     for (NSInteger i = fullStarCount; i < kStartCount ; i++) {
        [self makeStarViewWithImageName:@"empty_star"  startPosition:i];
    }
 } 
 


2.根据位置设置设置图片

- (void)makeStarViewWithImageName:(NSString *)imageName startPosition:(NSInteger) position{
    
    //如果重新设置评分,会重新创建imageView 需要判断 若已经存在5个imageView不去创建
    UIImageView *imageView = nil;
    if (self.subviews.count == kStartCount) {
        
        imageView = self.subviews[position];
        imageView.image = [UIImage imageNamed:imageName];
        
        return;
    }
    
    imageView = [[UIImageView alloc]init];
    imageView.image = [UIImage imageNamed:imageName];
    [imageView sizeToFit];
    imageView.frame = CGRectOffset(imageView.bounds, imageView.bounds.size.width * position, 0);
    [self addSubview:imageView];
    
}


3 .如果不判断会出现下面的情况


bug.png

样式2

样式2.gif
  • 本想通过循环创建5个imageView 但实现不了预期效果

1.加载xib 偷懒~
loadNibNamed: owner: options:
这个方法加载xib会把xib文件加载入缓存 不建议使用

+ (instancetype)loadStarView{
    UINib *nib = [UINib nibWithNibName:@"XHStarView" bundle:nil];
    XHStarView *starView = [[nib instantiateWithOwner:nil options:nil]lastObject];
    return starView;
}

2 .判断是否添加星星

@implementation XHStarView{
    BOOL _isAddStar;
}

3 . 判断点击的区域 (可以根据具体情况设置)


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self];
    if((point.x > self.starOne.x && point.x < (self.starFive.x + self.starFive.width))&&(point.y > self.starOne.y && point.y< self.height)){
        _isAddStar = YES;
        
    }else{
        _isAddStar = NO;
    }
}

4 .移动的时候添加星星

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    
    if(_isAddStar){
        UITouch *touch = [touches anyObject];
        CGPoint point = [touch locationInView:self];
        [self setStarForegroundViewWithPoint:point];

    }

    return;
}

5 .结束的时候禁止添加星星

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    if(_isAddStar){
        UITouch *touch = [touches anyObject];
        CGPoint point = [touch locationInView:self];
        [self setStarForegroundViewWithPoint:point];
    }
    _isAddStar = NO;
    return;
}

6 . 根据点击的位置x设置图片 并设置满星 1 分 半星0.5 空星0

-(CGFloat)changeImg:(float)x image:(UIImageView*)img{
    if(x > img.x + img.width/2){
        [img setImage:[UIImage imageNamed:@"StarSelected"]];
        return 1;
    }else if(x > img.x){
        [img setImage:[UIImage imageNamed:@"StarSelectHeaf"]];
        return 0.5;
    }else{
        [img setImage:[UIImage imageNamed:@"StarUnSelect"]];
        return 0;
    }
}

7 . 得出分数

-(void)setStarForegroundViewWithPoint:(CGPoint)point{

    self.score = 0;
    self.score = self.score + [self changeImg:point.x image:self.starOne];
    self.score = self.score + [self changeImg:point.x image:self.starTwo];
    self.score = self.score + [self changeImg:point.x image:self.starThree];
    self.score = self.score + [self changeImg:point.x image:self.starFour];
    self.score = self.score + [self changeImg:point.x image:self.starFive];
    
    //评论最少半星
    if(self.score == 0){
        self.score = 0.5;
        [self.starOne setImage:[UIImage imageNamed:@"StarSelectHeaf"]];
    }
    NSLog(@"分数 %f",self.score);
}

把得出的分数传给第一个demo就行了

代码链接

还有不足欢迎指教交流

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,068评论 4 62
  • 1 生活总是琐碎,一地鸡毛状。 偶得一日清闲,女人可能也要面对着家里杂乱的厨房,要分洗的衣服,亲戚的杂七杂八……于...
    绚之平淡阅读 1,317评论 4 24
  • 第八课 微写作:做推荐 就像上节课的提建议一样,做推荐也是我们生活中经常遇到的情景。当你在外面玩,吃到非常美味的食...
    田源ty阅读 2,056评论 0 2