iOS开发评分、打星
2017-04-11 本文已影响1275人
neo63
你好,欢迎浏览该文章。
评分、打星功能在很多APP中都会用到,因此自己封装了一个类实现该功能。其中分数可以为整数和小数。希望对你有所帮助。效果如下:
INTEGER_TYPE类型效果 FLOAT_TYPE类型效果具体实现:
1.首先添加一个协议,协议中申明一个optional方法,该方法监听评分改变事件。因为有的地方只显示星星对应的分数,因此该方法为optional。
@protocol ratingViewDelegate <NSObject>
@optional
- (void)ratingView:(LHRatingView *)view score:(CGFloat)score;
@end
2.定义一个枚举,枚举里面有两种类型,INTEGER_TYPE表示评分为整数,FLOAT_TYPE表示评分为小数。
typedef NS_ENUM(NSUInteger, RatingType) {
INTEGER_TYPE,
FLOAT_TYPE
};
3.实现类,定义一个LHRatingView类继承自UIView,再在类上添加两个view,一个grayStarView,一个foreStarView。grayStarView上添加空心的星星,foreStarView上添加实心的星星。再在LHRatingView上添加UITapGestureRecognizer和UIPanGestureRecognizer事件,用户点击或拖动时,改变foreStarView的宽度,即可实现该功能。
for (int i = 0; i < starNumber; i++) {
UIImage * grayImg = [UIImage imageNamed:@"image.bundle/starGray"];
UIImageView * grayImgView = [[UIImageView alloc]initWithFrame:CGRectMake((eachWidth+self.widDistance)*i, self.heiDistance, eachWidth, height)];
grayImgView.image = grayImg;
[self.grayStarView addSubview:grayImgView];
UIImage * foreImg = [UIImage imageNamed:@"image.bundle/starFore"];
UIImageView * foreImgView = [[UIImageView alloc]initWithFrame:CGRectMake((eachWidth+self.widDistance)*i, self.heiDistance, eachWidth, height)];
foreImgView.image = foreImg;
[self.foreStarView addSubview:foreImgView];
}
UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapGestureEvent:)];
UIPanGestureRecognizer * panGesture = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGestureEvent:)];
[self addGestureRecognizer:tapGesture];
[self addGestureRecognizer:panGesture];
注意:foreStarView的clipsToBounds属性需设置成YES。
self.foreStarView.clipsToBounds = YES;
拖动处理及事件监听:
#pragma mark - 拖动
- (void)panGestureEvent:(UIPanGestureRecognizer *)pan_
{
CGPoint point = [pan_ locationInView:self];
if (point.x < 0) {
return;
}
if(_ratingType == INTEGER_TYPE){
NSInteger count = (NSInteger)(point.x/(eachWidth+self.widDistance))+1;
point.x = count*(eachWidth+self.widDistance);
}
[self changeStarForeViewWithPoint:point];
}
#pragma mark - 设置显示的星星
- (void)changeStarForeViewWithPoint:(CGPoint)point
{
CGPoint p = point;
if (p.x < 0) {
return;
}
if (p.x < self.lowestScore/maxScore*CGRectGetWidth(self.frame))
{
p.x = self.lowestScore/maxScore*CGRectGetWidth(self.frame);
}
else if (p.x > self.frame.size.width)
{
p.x = self.frame.size.width;
}
float sc = p.x/CGRectGetWidth(self.frame);
CGRect fRect = self.foreStarView.frame;
fRect.size.width = p.x;
self.foreStarView.frame = fRect;
_score = sc*maxScore;
if(_ratingType == INTEGER_TYPE){
_score = (int)_score;
}
if(self.delegate && [self.delegate respondsToSelector:@selector(ratingView:score:)])
{
[self.delegate ratingView:self score:self.score];
}
}
GitHub Address:https://github.com/yutiandesan/PlayStar
恭喜你,看完了。
第一次在这儿发表文章,若有不合理的地方,欢迎指正。