在项目搭建界面过程中,在评价界面会有标签进行展示,如上图所示。
代码如下:
TagsLabelFrame.h
// TagsLabelFrame.h
// BNYTExpert
//
// Created by 贾倍 on 2018/3/24.
// Copyright © 2018年 贾倍. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#define TagsTitleFont [UIFont systemFontOfSize:13]
@interface TagsLabelFrame : NSObject
/**
标签数组
*/
@property(nonatomic,strong)NSArray *tagsArray;
/**
标签数组frame
*/
@property(nonatomic,strong)NSMutableArray *tagsFrames;
/**
全部标签高度
*/
@property(nonatomic,assign)CGFloat tagsHeight;
/**
标签间距 默认10
*/
@property(nonatomic,assign)CGFloat tagsMargin;
/**
标签行间距 默认10
*/
@property(nonatomic,assign)CGFloat tagsLineSpacing;
/**
标签最新内边距 默认10
*/
@property(nonatomic,assign)CGFloat tagsMinPadding;
@end
TagsLabelFrame.m
// TagsLabelFrame.m
// BNYTExpert
//
// Created by 贾倍 on 2018/3/24.
// Copyright © 2018年 贾倍. All rights reserved.
//
#import "TagsLabelFrame.h"
@implementation TagsLabelFrame
//初始化
-(id)init {
self = [super init];
if (self) {
_tagsFrames = [NSMutableArray array];
_tagsMinPadding = 10;
_tagsMargin = 10;
_tagsLineSpacing = 10;
}
return self;
}
-(void)setTagsArray:(NSArray *)tagsArray{
_tagsArray = tagsArray;
CGFloat btnX = _tagsMargin;
CGFloat btnW = 0;
CGFloat nextW = 0;//下一个标签的宽度
CGFloat moreW = 0;//每一行多出来的宽度
//每一行的最后一个tag的索引的数组和每一行多出来的宽度的数组
NSMutableArray *lastIndexs = [NSMutableArray array];
NSMutableArray *moreWidths = [NSMutableArray array];
for (NSInteger i = 0; i<tagsArray.count; i++) {
btnW = [self sizeWithText:tagsArray[i] font:TagsTitleFont].width + _tagsMinPadding *2;
if (i < tagsArray.count - 1) {
nextW = [self sizeWithText:tagsArray[i+1] font:TagsTitleFont].width + _tagsMinPadding * 2;
}
CGFloat nextBtnX = btnX + btnW + _tagsMargin;
//如果下一个按钮,标签最右侧则换行
if ((nextBtnX + nextW) > (SCREEN_WIDTH - _tagsMargin)) {
//计算超过的宽度
moreW = SCREEN_WIDTH - nextBtnX;
[lastIndexs addObject:[NSNumber numberWithInteger:i]];
[moreWidths addObject:[NSNumber numberWithInteger:i]];
btnX = _tagsMargin;
} else {
btnX += (btnW + _tagsMargin);
}
//如果是最后一个且数组中没有,则吧最后一个加入数组
if (i == tagsArray.count - 1) {
if (![lastIndexs containsObject:[NSNumber numberWithInteger:i]]) {
[lastIndexs addObject:[NSNumber numberWithInteger:i]];
[moreWidths addObject:[NSNumber numberWithFloat:0]];
}
}
}
NSInteger location = 0;//截取的位置
NSInteger length = 0;//截取的长度
CGFloat averageW = 0;//多出来的平均宽度
CGFloat tagW = 0;
CGFloat tagH = 30;
for (NSInteger i = 0; i < lastIndexs.count; i++) {
NSInteger lastIndex = [lastIndexs[i] integerValue];
if (i == 0) {
length = lastIndex + 1;
} else {
length = [lastIndexs[i] integerValue] - [lastIndexs[i - 1] integerValue];
}
//从数组中截取每一行的数组
NSArray *newArr = [tagsArray subarrayWithRange:NSMakeRange(location, length)];
location = lastIndex + 1;
averageW = [moreWidths[i] floatValue]/newArr.count;
CGFloat tagX = _tagsMargin;
CGFloat tagY = _tagsLineSpacing + (_tagsLineSpacing + tagH) *i;
for (NSInteger j = 0; j < newArr.count; j++) {
tagW = [self sizeWithText:newArr[j] font:TagsTitleFont].width + _tagsMinPadding *2 + averageW;
CGRect btnF = CGRectMake(tagX, tagY, tagW, tagH);
[_tagsFrames addObject:NSStringFromCGRect(btnF)];
tagX += (tagW + _tagsMargin);
}
}
_tagsHeight = (tagH + _tagsLineSpacing) * lastIndexs.count + _tagsLineSpacing;
}
/**
单行文本数据获取宽高
@param text 文本
@param font 字体
@return 宽高
*/
-(CGSize)sizeWithText:(NSString *)text font:(UIFont *)font{
NSDictionary *attrs = @{NSFontAttributeName:font};
return [text sizeWithAttributes:attrs];
}
@end
使用:
1.引入头文件,以及定义变量
2.初始化
3.使用