评分星星New Version
// // HYBCommentStarView.h // CloudShopping // // Created by huangyibiao on 14-8-4. // Copyright (c) 2014年 uni2uni. All rights reserved. // #import <UIKit/UIKit.h> @class HYBCommentStarView; /*! * @brief 点击星星评分代理 * @author huangyibiao */ @protocol HYBCommentStarViewDelegate <NSObject> @optional // 通过调用此方法来获取得分 - (void)commentStarView:(HYBCommentStarView *)view score:(float)score; @end /*! * @brief 评论中使用到的星星等级图片显示视图 * @author huangyibiao */ @interface HYBCommentStarView : UIView // 获取或设置能否通过点击评分 @property (nonatomic, assign) BOOL canTouch; // 总星级数 @property (nonatomic, readonly) NSUInteger numberOfStar; @property (nonatomic, weak) id<HYBCommentStarViewDelegate> delegate; - (id)initWithFrame:(CGRect)frame numberOfStar:(int)number; /*! * @brief 设置得分,并更新星级,精确到0.1分 * @param score 评分 */ - (void)setScore:(float)score; @end
//
// HYBCommentStarView.m
// CloudShopping
//
// Created by huangyibiao on 14-8-4.
// Copyright (c) 2014年 uni2uni. All rights reserved.
//
#import "HYBCommentStarView.h"
#define kBackgroundStarImageName @"evaluation_uncheck"
#define kForegroundStarImageName @"evaluation_ico"
#define kDistance 1.5 // 间隔
@interface HYBCommentStarView ()
@property (nonatomic, strong) UIView *starBackgroundView;
@property (nonatomic, strong) UIView *starForegroundView;
@end
@implementation HYBCommentStarView
- (id)init {
return [self initWithFrame:CGRectZero];
}
- (id)initWithFrame:(CGRect)frame {
return [self initWithFrame:frame numberOfStar:5];
}
- (id)initWithFrame:(CGRect)frame numberOfStar:(int)number {
frame.size.width = number * kImageWithName(kBackgroundStarImageName).size.width + number * kDistance;
frame.size.height = kImageWithName(kBackgroundStarImageName).size.height;
self = [super initWithFrame:frame];
if (self) {
self.canTouch = NO;
_numberOfStar = number;
self.starBackgroundView = [self buidlStarViewWithImageName:kBackgroundStarImageName];
self.starForegroundView = [self buidlStarViewWithImageName:kForegroundStarImageName];
[self addSubview:self.starBackgroundView];
[self addSubview:self.starForegroundView];
[self setScore:0];
}
return self;
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
if (!self.canTouch) {
return;
}
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self];
CGRect rect = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
if(CGRectContainsPoint(rect,point)) {
[self changeStarForegroundViewWithPoint:point];
}
return;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
if (!self.canTouch) {
return;
}
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self];
__weak HYBCommentStarView *weekSelf = self;
[UIView transitionWithView:self.starForegroundView
duration:0.2
options:UIViewAnimationOptionCurveEaseInOut
animations:^ {
[weekSelf changeStarForegroundViewWithPoint:point];
}
completion:nil];
return;
}
- (UIView *)buidlStarViewWithImageName:(NSString *)imageName {
UIView *view = [[UIView alloc] initWithFrame:self.bounds];
view.clipsToBounds = YES;
CGFloat originX = 0;
for (int i = 0; i < self.numberOfStar; i ++) {
CGRect fm = CGRectMake(originX,
0,
kImageWithName(kBackgroundStarImageName).size.width,
self.height);
UIImageView *imageView = [HYBUIMaker imageViewWithFrame:fm imageName:imageName];
originX = imageView.rightX + kDistance;
[view addSubview:imageView];
}
return view;
}
- (void)changeStarForegroundViewWithPoint:(CGPoint)point {
CGPoint p = point;
if (p.x < 0) {
p.x = 0;
} else if (p.x > self.width) {
p.x = self.width;
}
NSString *str = [NSString stringWithFormat:@"%0.2f", p.x / self.width];
float score = [str floatValue];
p.x = self.width * score + (NSUInteger)score * kDistance;
self.starForegroundView.frame = CGRectMake(0, 0, p.x, self.height);
if(self.delegate && [self.delegate respondsToSelector:@selector(commentStarView:score:)]) {
[self.delegate commentStarView:self score:score];
}
return;
}
- (void)setScore:(float)score {
CGPoint point = CGPointZero;
point.x = self.width * score + (NSUInteger)score * kDistance;
self.starForegroundView.frame = CGRectMake(0, 0, point.x, self.height);
if(self.delegate && [self.delegate respondsToSelector:@selector(commentStarView:score:)]) {
[self.delegate commentStarView:self score:score];
}
return;
}
@end
最后更新:2017-04-03 05:39:53