評分星星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