阅读688 返回首页    go 阿里云 go 技术社区[云栖]


星星评分定制

//
//  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

  上一篇:go android中include和merge标记
  下一篇:go 【eps=1e-9】poj 2163 Easy Trading