Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# XHStarRateView
iOS自定义星级评论视图 ⭐️⭐️⭐️⭐️⭐️

## Demo

![](https://ws2.sinaimg.cn/large/006tKfTcly1fmxkuml0brg30af0ij0y0.gif)

## 功能特性
* 支持设置任意星星数量;
* 支持动画修改评论效果;
* 多种评分样式支持:整星评论、半星评论、不完整星星评论;
* 支持 block 和 delegate 两种方式返回修改结果;
* 支持代码和 Nib 方式创建视图;



## 如何使用

1. 下载并拖拽 **XHStarRateView.h** 与 **XHStarRateView.m** 文件到项目。
2. 导入头文件 `import "XHStarRateView.h"`。
3. 如果需要,遵守代理协议 **XHStarRateViewDelegate**。



### 通过代理的方法获取当前评分数

```objective-c
XHStarRateView *starRateView = [[XHStarRateView alloc] initWithFrame:CGRectMake(20, 60, 200, 30)];
starRateView.isAnimation = YES; // 设置是否有动画
starRateView.rateStyle = XHStarRateViewRateStyeIncompleteStar; // 设置星级评分样式
starRateView.tag = 1;
starRateView.delegate = self; // 遵守代理协议
[self.view addSubview:starRateView];
```

你也可以使用封装好的完全初始化方法:

```objective-c
XHStarRateView *starRateView2 = [[XHStarRateView alloc] initWithFrame:CGRectMake(20, 100, 200, 30) numberOfStar:5 rateStyle:XHStarRateViewRateStyeHalfStar isAnimation:NO delegate:self];
starRateView2.tag = 2;
[self.view addSubview:starRateView2];
```

实现代理协议:

```objective-c
-(void)starRateView:(XHStarRateView *)starRateView ratingDidChange:(CGFloat)currentRating {
NSLog(@"%ld---- %f",(long)starRateView.tag,currentRating);
}
```



### 通过Block传值的方法获取当前评分数

```objective-c
XHStarRateView *starRateView3 = [[XHStarRateView alloc] initWithFrame:CGRectMake(20, 140, 200, 30) completion:^(CGFloat currentScore) {
NSLog(@"3---- %f",currentScore);
}];

[self.view addSubview:starRateView3];
```

当然,此方式也有一个可用的完全初始化方法:

```objective-c
XHStarRateView *starRateView4 = [[XHStarRateView alloc] initWithFrame:CGRectMake(20, 180, 200, 30) numberOfStar:8 rateStyle:XHStarRateViewRateStyeHalfStar isAnimation:YES completion:^(CGFloat currentScore) {
NSLog(@"4---- %f",currentScore);
}];
[self.view addSubview:starRateView4];
```






9 changes: 7 additions & 2 deletions XHStarRateView.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,7 @@
TargetAttributes = {
2F20EDC41CAE16D600B650B7 = {
CreatedOnToolsVersion = 7.3;
DevelopmentTeam = C33JS9A6R3;
};
2F20EDDD1CAE16D600B650B7 = {
CreatedOnToolsVersion = 7.3;
Expand Down Expand Up @@ -357,10 +358,11 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
DEVELOPMENT_TEAM = C33JS9A6R3;
INFOPLIST_FILE = XHStarRateView/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.1;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.huahua.XHStarRateView;
PRODUCT_BUNDLE_IDENTIFIER = com.tonintech.XHStarRateView;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
Expand All @@ -369,10 +371,11 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
DEVELOPMENT_TEAM = C33JS9A6R3;
INFOPLIST_FILE = XHStarRateView/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.1;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.huahua.XHStarRateView;
PRODUCT_BUNDLE_IDENTIFIER = com.tonintech.XHStarRateView;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
Expand Down Expand Up @@ -420,6 +423,7 @@
2F20EDE91CAE16D600B650B7 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
2F20EDEA1CAE16D600B650B7 /* Build configuration list for PBXNativeTarget "XHStarRateViewTests" */ = {
isa = XCConfigurationList;
Expand All @@ -428,6 +432,7 @@
2F20EDEC1CAE16D600B650B7 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
Expand Down
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>XHStarRateView.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
</dict>
</plist>
25 changes: 25 additions & 0 deletions XHStarRateView/Assets.xcassets/AppIcon.appiconset/Contents.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
Expand Down Expand Up @@ -30,6 +40,16 @@
"size" : "60x60",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "29x29",
Expand Down Expand Up @@ -64,6 +84,11 @@
"idiom" : "ipad",
"size" : "83.5x83.5",
"scale" : "2x"
},
{
"idiom" : "ios-marketing",
"size" : "1024x1024",
"scale" : "1x"
}
],
"info" : {
Expand Down
16 changes: 10 additions & 6 deletions XHStarRateView/Base.lproj/LaunchScreen.storyboard
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8150" systemVersion="15A204g" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="01J-lp-oVM">
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8122"/>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
Expand All @@ -13,10 +18,9 @@
<viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
Expand Down
17 changes: 11 additions & 6 deletions XHStarRateView/Base.lproj/Main.storyboard
Original file line number Diff line number Diff line change
@@ -1,21 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6211" systemVersion="14A298i" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6204"/>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="" sceneMemberID="viewController">
<viewController id="BYZ-38-t0r" customClass="ViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
Expand Down
2 changes: 2 additions & 0 deletions XHStarRateView/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LSApplicationCategoryType</key>
<string></string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
Expand Down
31 changes: 24 additions & 7 deletions XHStarRateView/ViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -17,31 +17,48 @@ @implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

/*
1. Delegate 方式创建
*/
XHStarRateView *starRateView = [[XHStarRateView alloc] initWithFrame:CGRectMake(20, 60, 200, 30)];
starRateView.isAnimation = YES;
starRateView.rateStyle = IncompleteStar;
starRateView.isAnimation = YES; // 有动画
starRateView.rateStyle = XHStarRateViewRateStyeIncompleteStar; //允许不完整星评论
starRateView.tag = 1;
starRateView.delegate = self;
[self.view addSubview:starRateView];

XHStarRateView *starRateView2 = [[XHStarRateView alloc] initWithFrame:CGRectMake(20, 100, 200, 30) numberOfStars:5 rateStyle:HalfStar isAnination:YES delegate:self];
/*
2. 初始化方法创建
半星评论、无动画
*/
XHStarRateView *starRateView2 = [[XHStarRateView alloc] initWithFrame:CGRectMake(20, 100, 200, 30) numberOfStar:5 rateStyle:XHStarRateViewRateStyeHalfStar isAnimation:NO delegate:self];
starRateView2.tag = 2;
[self.view addSubview:starRateView2];

XHStarRateView *starRateView3 = [[XHStarRateView alloc] initWithFrame:CGRectMake(20, 140, 200, 30) finish:^(CGFloat currentScore) {
/*
3. block 方法1
默认设置:完整星评论、
*/
XHStarRateView *starRateView3 = [[XHStarRateView alloc] initWithFrame:CGRectMake(20, 140, 200, 30) completion:^(CGFloat currentScore) {
NSLog(@"3---- %f",currentScore);
}];

[self.view addSubview:starRateView3];

XHStarRateView *starRateView4 = [[XHStarRateView alloc] initWithFrame:CGRectMake(20, 180, 200, 30) numberOfStars:5 rateStyle:HalfStar isAnination:YES finish:^(CGFloat currentScore) {
/*
4. block 方法2
半星评论、有动画
*/
XHStarRateView *starRateView4 = [[XHStarRateView alloc] initWithFrame:CGRectMake(20, 180, 200, 30) numberOfStar:8 rateStyle:XHStarRateViewRateStyeHalfStar isAnimation:YES completion:^(CGFloat currentScore) {
NSLog(@"4---- %f",currentScore);
}];
[self.view addSubview:starRateView4];

}

-(void)starRateView:(XHStarRateView *)starRateView currentScore:(CGFloat)currentScore{
NSLog(@"%ld---- %f",starRateView.tag,currentScore);
-(void)starRateView:(XHStarRateView *)starRateView ratingDidChange:(CGFloat)currentRating {
NSLog(@"%ld---- %f",(long)starRateView.tag,currentRating);
}

@end
60 changes: 44 additions & 16 deletions XHStarRateView/XHStarRateView/XHStarRateView.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,33 +9,61 @@
#import <UIKit/UIKit.h>
@class XHStarRateView;

typedef void(^finishBlock)(CGFloat currentScore);
/**
点击评分的 block 回调

typedef NS_ENUM(NSInteger, RateStyle)
{
WholeStar = 0, //只能整星评论
HalfStar = 1, //允许半星评论
IncompleteStar = 2 //允许不完整星评论
};
@param currentScore 当前评论分数,CGFloat 类型
*/
typedef void(^XHStarRateViewRateCompletionBlock)(CGFloat currentScore);

@protocol XHStarRateViewDelegate <NSObject>
/**
星级评分样式

-(void)starRateView:(XHStarRateView *)starRateView currentScore:(CGFloat)currentScore;
- XHStarRateViewRateStyeFullStar: 整星评论,默认样式。
- XHStarRateViewRateStyeHalfStar: 允许半星评论。
- XHStarRateViewRateStyeIncompleteStar: 允许不完整星评论。
*/
typedef NS_ENUM(NSUInteger, XHStarRateViewRateStye) {
XHStarRateViewRateStyeFullStar,
XHStarRateViewRateStyeHalfStar,
XHStarRateViewRateStyeIncompleteStar,
};

/**
点击评分的代理方法
*/
@protocol XHStarRateViewDelegate <NSObject>
-(void)starRateView:(XHStarRateView *)starRateView ratingDidChange:(CGFloat)currentRating;
@end

@interface XHStarRateView : UIView

@property (nonatomic,assign)BOOL isAnimation; //是否动画显示,默认NO
@property (nonatomic,assign)RateStyle rateStyle; //评分样式 默认是WholeStar
@property (nonatomic, weak) id<XHStarRateViewDelegate>delegate;
@property (nonatomic, assign) BOOL isAnimation; // 是否动画显示,默认 NO
@property (nonatomic, assign) XHStarRateViewRateStye rateStyle; // 星级评分样式
@property (nonatomic, assign) CGFloat currentRating; // 当前评分,默认为 0
@property (nonatomic, weak) id<XHStarRateViewDelegate> delegate;

/**
*通过代理的方法获取当前评分数
*/
- (instancetype)initWithFrame:(CGRect)frame;

-(instancetype)initWithFrame:(CGRect)frame;
-(instancetype)initWithFrame:(CGRect)frame numberOfStars:(NSInteger)numberOfStars rateStyle:(RateStyle)rateStyle isAnination:(BOOL)isAnimation delegate:(id)delegate;
- (instancetype)initWithFrame:(CGRect)frame
numberOfStar:(NSInteger)numberOfStar
rateStyle:(XHStarRateViewRateStye)rateStyle
isAnimation:(BOOL)isAnimation
delegate:(id)delegate;

/**
*通过Block传值的方法获取当前评分数
*/
- (instancetype)initWithFrame:(CGRect)frame
completion:(XHStarRateViewRateCompletionBlock)completionBlock;

-(instancetype)initWithFrame:(CGRect)frame finish:(finishBlock)finish;
-(instancetype)initWithFrame:(CGRect)frame numberOfStars:(NSInteger)numberOfStars rateStyle:(RateStyle)rateStyle isAnination:(BOOL)isAnimation finish:(finishBlock)finish;
- (instancetype)initWithFrame:(CGRect)frame
numberOfStar:(NSInteger)numberOfStar
rateStyle:(XHStarRateViewRateStye)rateStyle
isAnimation:(BOOL)isAnimation
completion:(XHStarRateViewRateCompletionBlock)completionBlock;

@end
Loading