设计如下图:
设计需求 :
1. 评论内容不能超过150个字。
2.上传图片不能超过4张,点击可看大图,可删除图片。
3. 根据用户星级个数对用户满意级别做出评价。
一.评论文字(UITextView)
1. 因为UITextView没有placeholder,所以UIlabel控制默认文字的显示
//添加addPlaceholder
-(void)addPlaceholderLabel{
self.placeholderLabel=[[UILabel alloc] initWithFrame:CGRectMake(5, -5, kScreenWidth-50, 44)];
self.placeholderLabel.text=@"";
self.placeholderLabel.textColor=titleColor ;
self.placeholderLabel.font=[UIFont systemFontOfSize:titleFont];
[self addSubview:self.placeholderLabel];
}
- (void)setPlaceholder:(NSString *)placeholder {
_placeholder=placeholder;
self.placeholderLabel.text=_placeholder;
}
2. 控制文字输入的最大长度
- (void)textViewDidChangeText:(NSNotification *)notification
{
UITextView *textView = (UITextView *)notification.object;
NSString *toBeString = textView.text;
if([IHUtility isBlankString:textView.text]){
self.placeholderLabel.hidden = NO;
}else
{
self.placeholderLabel.hidden = YES;
}
// 获取键盘输入模式
NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage];
// 中文输入的时候,可能有markedText(高亮选择的文字),需要判断这种状态
// zh-Hans表示简体中文输入, 包括简体拼音,健体五笔,简体手写
if ([lang isEqualToString:@"zh-Hans"]) {
UITextRange *selectedRange = [textView markedTextRange];
//获取高亮选择部分
UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
// 没有高亮选择的字,表明输入结束,则对已输入的文字进行字数统计和限制
if (!position) {
if (toBeString.length > [_kMaxLength intValue]) {
// 截取子串
textView.text = [toBeString substringToIndex: [_kMaxLength intValue]];
}
} else { // 有高亮选择的字符串,则暂不对文字进行统计和限制
}
} else {
// 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
if (toBeString.length > [_kMaxLength intValue]) {
// 截取子串
textView.text = [toBeString substringToIndex: [_kMaxLength intValue]];
}
}
}
3.键盘弹出有完成按钮供用户选择
-(void)hideKeyBoard:(id)sender{
UIView *v=[self viewWithTag:1001];
v.origin=CGPointMake(0, kScreenHeight);
[self resignFirstResponder];
NSLog(@"输入:%@",self.text);
if(![IHUtility isBlankString:self.text]&&![self isEmpty:self.text]){
if (self.delegateBtn != nil && [self.delegateBtn respondsToSelector:@selector(didClickFinishBtn:)]) {
[self.delegateBtn didClickFinishBtn:self.text ];
}
}
}
二.上传图片
1. 上传图片最多4张,用UICollectionViewCell
TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithMaxImagesCount:self.maxImageCount - self.selectIndexPath.item delegate:self];
[self presentViewController:imagePickerVc animated:YES completion:nil];
if (self.dataArr.count > self.maxImageCount) {
NSRange range = NSMakeRange(self.maxImageCount, self.dataArr.count - self.maxImageCount);
[self.dataArr removeObjectsInRange:range];
}
[self.collectionView reloadData];
2.大图浏览,删除
SDPhotoBrowser *browser = [[SDPhotoBrowser alloc] init];
browser.currentImageIndex = indexPath.row ;
browser.sourceImagesContainerView = self.collectionView;
//NSArray *pictures = [self.model.contentPicture componentsSeparatedByString:@","];
browser.flag = self.flag;
browser.imageCount = self.dataArr.count;
browser.delegate = self;
[browser show];
// 删除照片
- (void)delectPaicture:(NSNotification *)notification{
NSDictionary *dict = notification.object;
NSInteger currentIndex = [[dict valueForKey:@"index"] integerValue];
if (self.dataArr.count > 0) {
[self.dataArr removeObjectAtIndex:currentIndex];
}
[self.collectionView reloadData];
[self resetHeight];
}
3.用户禁止访问时
NSString *appName = [[NSBundle mainBundle].infoDictionary valueForKey:@"CFBundleDisplayName"];
if (!appName) appName = [[NSBundle mainBundle].infoDictionary valueForKey:@"CFBundleName"];
_tipLable.text = [NSString stringWithFormat:@"请在%@的\"设置-隐私-照片\"选项中,\r允许%@访问你的手机相册。",[UIDevice currentDevice].model,appName];
[self.view addSubview:_tipLable];
三.星级评价
封装一个星级评价的view,代理或Block都可获得当前用户选择的星星个数。
/**
*通过代理的方法获取当前评分数currentScore
*/
-(instancetype)initWithFrame:(CGRect)frame numberOfStars:(NSInteger)numberOfStars currentStars:(NSInteger)currentStars rateStyle:(StarRateViewStyle)rateStyle isAnination:(BOOL)isAnimation delegate:(id)delegate;
/**
*通过Block传值的方法获取当前评分数currentScore
*/
-(instancetype)initWithFrame:(CGRect)frame numberOfStars:(NSInteger)numberOfStars currentStars:(NSInteger)currentStars rateStyle:(StarRateViewStyle)rateStyle isAnination:(BOOL)isAnimation finish:(finishBlock)finish;
1.设置星星数量
- (void)createStarsContentView:(UIImage *)starImage starRate:(CGFloat)starRate {
if (self.numberOfStars == 0) {
return;
}
NSInteger index = (NSInteger)floor(currentStarRate);
CGFloat w = (self.starSize.width + self.spacingBetweenStars) * index + (currentStarRate - index) * self.starSize.width;
CGFloat x = (CGRectGetWidth(self.bounds) - [self sizeForNumberOfStar:self.numberOfStars].width) * 0.5;
CGFloat y = (CGRectGetHeight(self.bounds) - [self sizeForNumberOfStar:self.numberOfStars].height) * 0.5;
CGFloat h = self.starSize.height;
CGRect frame = CGRectMake(x, y, w, h);
UIView *starsContentView = [[UIView alloc] initWithFrame:frame];
starsContentView.clipsToBounds = YES;
[self addSubview:starsContentView];
for (int i = 0; i < self.numberOfStars; i++) {
UIImageView *imageView = [[UIImageView alloc] initWithImage:starImage];
imageView.frame = CGRectMake((self.starSize.width + self.spacingBetweenStars) * i, 0, self.starSize.width, self.starSize.height);
imageView.contentMode = UIViewContentModeScaleAspectFit;
[starsContentView addSubview:imageView];
}
[self.starsContentViews addObject:starsContentView];
}
2.用户点击事件
#pragma mark - event
//一根手指或多根手指触摸开始
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
UIView *view = touch.view;
if (view != self) {
CGPoint point = [touch locationInView:view];
[self setupScoreWithOffsetX:point.x];
}
}
//一根手指或多根手指在屏幕上移动(随着手指的移动,会触发该事件)
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
UIView *view = touch.view;
if (view != self && [self.starsContentViews containsObject:view]) {
CGPoint point = [touch locationInView:view];
[self setupScoreWithOffsetX:point.x];
}
}
3.计算评分值
NSInteger index = offsetX / (self.starSize.width + self.spacingBetweenStars);
CGFloat mathOffsetX = (index + 1) * self.starSize.width + index * self.spacingBetweenStars;
CGFloat score = (offsetX - index * self.spacingBetweenStars)/(self.starSize.width);
if (offsetX > mathOffsetX) {
score = index + 1;
}
if(self.style==StarRateViewStyleWholeStar){
self.currentStarRate =ceil(score);
}else
{
self.currentStarRate = round(score) > score ? round(score) : (ceil(score)-0.5);
}
if (self.complete) {
_complete(self.currentStarRate);
}
if ([self.delegate respondsToSelector:@selector(starRateView:didSelecteStarAtStarRate:)]) {
[self.delegate starRateView:self didSelecteStarAtStarRate:self.currentStarRate];
}
4.具体使用
#pragma StarRateView代理方法
- (void)starRateView:(StarRateView *)starRateView didSelecteStarAtStarRate:(CGFloat)currentScore {
for(int i=0;i<_starArray.count;i++){
StarRateView *starView = _starArray[i];
if(starRateView.tag==starView.tag){
[_lastStarRateDict setObject:[NSString stringWithFormat:@"%d",(int)currentScore] forKey:[NSString stringWithFormat:@"%d",(int)starRateView.tag]];
UILabel *infoLabel = _infoArray[i];
if(currentScore>4){
infoLabel.text = @"很满意";
}else if (currentScore>1){
infoLabel.text = @"满意";
}else
{
infoLabel.text = @"一般";
}
}
}
}
四.下载地址
五.使用介绍
1.初始化YJTextView
-(YJTextView*)textView{
if(!_textView){
_textView = [[YJTextView alloc]initWithFrame:CGRectMake(15, 100, kScreenWidth-30, 125)];
_textView.backgroundColor = RGBA(245, 245, 245, 1);
_textView.layer.masksToBounds = YES;
_textView.layer.cornerRadius = 8;
_textView.kMaxLength = @150;
_textView.placeholder = @"说说商家到亮点与不足吧!";
_textView.placeholderLabel.textColor = RGBA(153, 153, 153, 1);
}
return _textView;
}
2. 上传图片
CXXChooseImageViewController *vc = [[CXXChooseImageViewController alloc] init];
vc.view.backgroundColor=[UIColor clearColor];
vc.delegate = self;
self.vc = vc;
[self addChildViewController:vc];
CGFloat photoWith =( kScreenWidth-55)/4;
[vc setOrigin:CGPointMake(7,_textView.bottom) ItemSize:CGSizeMake(photoWith, photoWith) rowCount:4];
[self.view insertSubview:vc.view atIndex:[self.view subviews].count];
vc.maxImageCount = 4;
//代理的方法代表上传的图片值
-(void)pickImages:(NSArray *)imageArr andAllPickPitures:(NSArray *)allPitures
{
_allPickPitures = [[NSMutableArray alloc]initWithArray:allPitures];
}
3.初始化星级view
StarRateView *starRateView = [[StarRateView alloc]initWithFrame:CGRectMake(textLabel.right+10, _textView.bottom+90+50+i*(24+20), 200, 10) numberOfStars:5 currentStars:0 rateStyle:0 isAnination:YES delegate:self];
starRateView.tag = 100+i;
[self.view addSubview:starRateView];
4.获得最终的数据
//去发布
-(void)gotoPublic{
NSLog(@"输入评论:%@",self.textView.text);
NSLog(@"上传的图片%@",_allPickPitures);
NSLog(@"第三者的评分%@",_lastStarRateDict);
}
本篇独发金蝶云社区
推荐阅读