iOS地图iOS直播视频iOS即时通讯

iOS实践:一步步实现星级评分

2016-11-13  本文已影响615人  非典型技术宅

星级评分在几乎每一个电商平台都会出现,其实在这个星级评分里面不管有多少分,最终我们只用到了三张图片。我们把这个星级评分抽象出来看,每颗星星只有三种状态,半星、满星、空星。

Paste_Image.png

需求如下

经过分析,可以按照下面的思路来进行开发。

Paste_Image.png

1. 创建星星

例如评分是3.7分。
那满星就是(取整)3.7= 3
半星就是3.7 -3 = 0.7 。就是有半星。
空星:5 - 3 - 1 = 1.

/**
 重写属性level的方法,一旦给此属性赋值,就创建星星

 @param level 评级分数
 */
- (void)setLevel:(CGFloat)level{
    _level = level;
    
//    满星
    NSInteger fullStarNumber = (NSInteger)level;
    for (NSInteger i = 0; i < fullStarNumber; i++) {
        [self createStartViewWithImageName:@"full_star" andWithStarPosition:i];
    }
    
//    半星
    if ((level - fullStarNumber) > 0) {
        [self createStartViewWithImageName:@"half_star" andWithStarPosition:fullStarNumber];
        
        fullStarNumber++;
    }
    
//    空星
    for (NSInteger i = fullStarNumber; i < STAR_AMOUNT_NUMBER; i++) {
        [self createStartViewWithImageName:@"empty_star" andWithStarPosition:i];
    }
}

2. 优化

上面这段代码执行之后,稍微细心点就会发现创建非常多的装星星的UIImageVIew。每一颗星星都会创建一个UIImageVIew,这样会导致性能非常低下。如果页面用到的次数过多,就会因为内存过大闪退。

/**
 根据图片的名称,以及相应的个数,创建星星的图层

 @param imageName  星星图片的名称:全星、半星、空星
 @param starNumber 对应星星类型的位置
 */
- (void)createStartViewWithImageName:(NSString *)imageName andWithStarPosition:(NSInteger)starPosition{
    UIImageView *imageView = nil;
    
//    如果发现星星已经创建了,就不要再创建了,重新给图片就可以了
    if (self.subviews.count == STAR_AMOUNT_NUMBER) {
        imageView = self.subviews[starPosition];
        imageView.image = [UIImage imageNamed:imageName];
        
        return ;
    }
    
    imageView = [[UIImageView alloc]init];
    imageView.image = [UIImage imageNamed:imageName];
    [imageView sizeToFit];
    imageView.frame = CGRectOffset(imageView.bounds, starPosition * imageView.bounds.size.width, 0);
    [self addSubview:imageView];
}

3. 灵异事件

上一篇 下一篇

猜你喜欢

热点阅读