iOS星级选择,可滑动的,可点击

iOS 星级选择,可以设置星星的个数,星级间距,可以设置分数。

一:.h文件定义

@interface FSStarView : UIView

/**
 *  设置控件分数
 *  score     分数
 */
@property(nonatomic,assign) CGFloat score;
/**
 *  Init FSStarView
 *
 *  @param frame  Rectangles
 *  @param numberOfStar 星星个数
 *  @param space 星星间距
 *
 *  @return FSStarViewObject
 */
- (instancetype)initWithFrame:(CGRect)frame NumberOfStar:(NSInteger)numberOfStar Space:(CGFloat)space;

/**
 * 选择的block回调
 */
@property(nonatomic,copy)  void(^CommentsStartViewBlock) (NSInteger);
@end

二:.m文件定义

#import "FSStarView.h"
#define kBACKGROUND_STAR @"xingxing-kong"
#define kFOREGROUND_STAR @"xingxing"

@interface FSStarView ()

@property(nonatomic,assign) CGFloat space;
@property (nonatomic, assign) NSInteger numberOfStar;
@property (nonatomic, strong) UIView *starBackgroundView;
@property (nonatomic, strong) UIView *starForegroundView;
@end

@implementation FSStarView
- (instancetype)initWithFrame:(CGRect)frame NumberOfStar:(NSInteger)numberOfStar Space:(CGFloat)space{
    self = [super initWithFrame:frame];
    if (self) {
        _numberOfStar = numberOfStar;
        _space = space;
        self.starBackgroundView = [self buidlStarViewWithImageName:kBACKGROUND_STAR];
        self.starForegroundView = [self buidlStarViewWithImageName:kFOREGROUND_STAR];
        [self addSubview:self.starBackgroundView];
        [self addSubview:self.starForegroundView];
        UITapGestureRecognizer *tapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGR:)];
        [self addGestureRecognizer:tapGR];
        //移动手势
        UIPanGestureRecognizer *panGR = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGR:)];
        [self addGestureRecognizer:panGR];
    }
    return self;
}


#pragma mark - Buidl Star View

/**
 *  通过图片构建星星视图
 *
 *  @param imageName 图片名称
 *
 *  @return 星星视图
 */
- (UIView *)buidlStarViewWithImageName:(NSString *)imageName
{
    CGRect frame = self.bounds;
    UIView *view = [[UIView alloc] initWithFrame:frame];
    view.clipsToBounds = YES;
    for (int i = 0; i < self.numberOfStar; i ++){
        UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:imageName]];
        imageView.userInteractionEnabled = YES;
        imageView.frame = CGRectMake(i * (frame.size.height + _space), 0, frame.size.height, frame.size.height);
        [view addSubview:imageView];
    }
    return view;
}


#pragma mark - Set Score

/**
 *  设置控件分数
 *
 *  @param score     分数
 */
- (void)setScore:(CGFloat)score{
    CGFloat pointX = score * self.frame.size.height + ((NSInteger)score)*_space;
    self.starForegroundView.frame = CGRectMake(0, 0, pointX, self.frame.size.height);
}



- (void)tapGR:(UITapGestureRecognizer *)tapGR
{//点击手势对应的消息,如果有参数,参数就是手势本身
    CGPoint point = [tapGR locationInView:tapGR.view];
    NSLog(@"%f  %f",point.x,point.y);
    if (point.x > ((self.frame.size.height + _space)*_numberOfStar)) {
        point.x = (self.frame.size.height + _space)*_numberOfStar;
    }else{
        point.x = point.x;
    }

    NSInteger numInt = (point.x+_space)/(self.frame.size.height + _space);
    CGFloat numFloat = (point.x+_space)/(self.frame.size.height + _space);
    if (numFloat > numInt) {
        numInt++;
    }else{
        numInt = numInt;
    }
    self.starForegroundView.width = numInt*(self.frame.size.height + _space);
    self.CommentsStartViewBlock(numInt);
}

- (void)panGR:(UIPanGestureRecognizer *)panGR
{//点击手势对应的消息,如果有参数,参数就是手势本身
    CGPoint point = [panGR locationInView:panGR.view];
    NSLog(@"%f  %f",point.x,point.y);
    if ((point.x>=0)&&(point.x<=(5*(self.frame.size.height + _space)))) {
        NSInteger num = (point.x+_space)/(self.frame.size.height + _space);
        self.starForegroundView.width = num*(self.frame.size.height + _space);
        self.CommentsStartViewBlock(num);
    }

}

@end

三:控件的使用

    FSStarView *starView = [[FSStarView alloc] initWithFrame:FRAME(0, 0, 100, 15) NumberOfStar:5 Space:5];
    starView.score = 3.0;//分值
    [self.view addSubview:view];
    starView.CommentsStartViewBlock = ^(NSInteger num){
      NSLog(@"=======%ld", num);
    };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值