程序猿
星星評(píng)分的核心是放置兩張星星視圖,一張灰色,一張黃色,灰色在下,黃色在上,默認(rèn)平鋪五顆灰色和黃色星星,然后從傳入的評(píng)分來控制黃色星星的底部視圖的寬度,而不是控制星星的樣式,黃色和灰色星星從一開始到最后都沒有變化,變化的只是放置星星的View的frame在變化。
效果展示
RatingView.h
為外部使用該類提供一個(gè)屬性,傳入星星的評(píng)分,供展示使用。
@property(assign,nonatomic)float rating;
RatingView.m
定義幾個(gè)屬性,寬度高度,灰色視圖View,黃色視圖View。寬度和高度用來控制一個(gè)星星的frame。兩個(gè)視圖用來顯示不同的星星。
CGFloat _width;
CGFloat _height;
UIView* _grayView;
UIView* _yellowView;
通過UIColor中的一個(gè)類方法來平鋪星星視圖,我們一開始獲取只有一張圖片,現(xiàn)在獲取圖片的size*5獲取底部view的大小,然后根據(jù)給定的底圖的frame,計(jì)算出倍數(shù),等比例放大或者縮小。
//平鋪灰星星
_grayView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed: @"gray" ]];
[self addSubview:_grayView];
//平鋪黃星星
_yellowView.backgroundColor = [UIColor colorWithPatternImage:yellowStar];
[self addSubview:_yellowView];
//獲取倍數(shù),根據(jù)倍數(shù)擴(kuò)大星星的大小
CGFloat scale = self.frame.size.width/_width;
//按照倍數(shù),放大
_grayView.transform = CGAffineTransformMakeScale(scale, scale);
_yellowView.transform = CGAffineTransformMakeScale(scale, scale);
底圖根據(jù)倍數(shù)經(jīng)過放大或者縮小后,位置放生了偏移,需要重新安置。
_grayView.frame = CGRectMake(0, 0, _grayView.frame.size.width, _grayView.frame.size.height);
_yellowView.frame = CGRectMake(0, 0, _yellowView.frame.size.width, _yellowView.frame.size.height);
最后復(fù)寫一下rating的set方法,給評(píng)分賦值,設(shè)置黃色底圖view的frame。
_yellowView.frame = CGRectMake(0, 0,
_grayView.frame.size.width*rating/10.0, _grayView.frame.size.height);
ViewController.m
這里為了演示效果,循環(huán)創(chuàng)建9個(gè)視圖。
for (int i = 0; i < 9; i++)
{
RatingView *ratingV = [[RatingView alloc]initWithFrame:CGRectMake(100, 40 + 40*i, 100, 30)];
ratingV.rating = i+1;
[self.view addSubview:ratingV];
}