星星評分定製
// // HYBCommentStarView.h // TQStarRatingView // // Created by huangyibiao on 14-8-13. // Copyright (c) 2014年 TinyQ. 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"
@interface HYBCommentStarView ()
@property (nonatomic, strong) UIView *starBackgroundView;
@property (nonatomic, strong) UIView *starForegroundView;
@end
@implementation HYBCommentStarView
- (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;
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;
for (int i = 0; i < self.numberOfStar; i ++) {
CGRect fm = CGRectMake(i * self.width / self.numberOfStar,
0,
self.width / self.numberOfStar,
self.height);
UIImageView *imageView = [HYBUIMaker imageViewWithFrame:fm imageName:imageName];
[view addSubview:imageView];
}
return view;
}
- (void)changeStarForegroundViewWithPoint:(CGPoint)point {
CGPoint p = point;
if (p.x < 0) {
p.x = 0;
} else if (p.x > self.frame.size.width) {
p.x = self.frame.size.width;
}
NSString *str = [NSString stringWithFormat:@"%0.2f", p.x / self.width];
float score = [str floatValue];
p.x = score * self.width;
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;
NSLog(@"score: %f", score);
self.starForegroundView.frame = CGRectMake(0, 0, point.x, self.height);
NSLog(@"%@, %@", NSStringFromCGRect(self.starForegroundView.frame) , NSStringFromCGRect(self.bounds));
if(self.delegate && [self.delegate respondsToSelector:@selector(commentStarView:score:)]) {
[self.delegate commentStarView:self score:score];
}
return;
}
@end
最後更新:2017-04-03 05:39:53