做项目的时候经常会用到标签,比如说现在很多项目中搜索历史用标签展示 和 选择某个产品的不同属性用标签展示...。网上的有很多封装好的标签,但是作为一个上进的程序员,都希望能有一个自己写的。其实也是一种积累知识的过程。现在的这个标签是根据你的标签的搜字母来排序的。下载地址:https://github.com/liguoliangiOS/LGLTagsView.git先来看下效果:

下面的是代码说明和代码:

(1)包括两个部分:LGLTagsFrame(计算标签的frame)  LGLTagsView(标签的展示的view)

(2)使用注意:请先把标签数组输入LGLTagsFrame计算出标签的总高度 再来利用创建LGLTagsView。

LGLTagsFrame.h

展开

//  Created by 李国良 on 2016/10/15.
// Copyright © 2016年 李国良. All rights reserved.
// #import <Foundation/Foundation.h>
#import <UIKit/UIKit.h> @interface LGLTagsFrame : NSObject /*
* @params tagsArray 标签名称数组
*/
@property (nonatomic, strong) NSArray * tagsArray; /*
* @params tagsTotalHeight 标签的总高度
*/
@property (nonatomic, assign) CGFloat tagsTotalHeight; /*
* @params tagsFrames 每个标签的frame数组
*/
@property (nonatomic, strong) NSMutableArray *tagsFrames; /*
* @params tagsMargin 标签左右之间的间隔 默认是10 (请在给tagsArray赋值之前设置)
*/
@property (nonatomic, assign) CGFloat tagsMargin; /*
* @params tagdPadding 标签上下之间的间隔 默认是10 (请在给tagsArray赋值之前设置)
*/
@property (nonatomic, assign) CGFloat tagsLineMargin; /*
* @params tagdPadding 标签内部的上下左右的间隔 (默认是10) (请在给tagsArray赋值之前设置)
*/
@property (nonatomic, assign) CGFloat tagdPadding; @end

LGLTagsFrame.m

//  Created by 李国良 on 2016/10/15.
// Copyright © 2016年 李国良. All rights reserved.
// #import "LGLTagsFrame.h"
#define WIDTH ([UIScreen mainScreen].bounds.size.width)
#define HEIGHT ([UIScreen mainScreen].bounds.size.height) @interface LGLTagsFrame () @property (nonatomic, strong) UIButton * startButton; @end @implementation LGLTagsFrame - (instancetype)init {
self = [super init];
if (self) {
self.tagsFrames = [NSMutableArray array];
self.tagsMargin = ;
self.tagsLineMargin = ;
self.tagdPadding = ;
}
return self;
} - (void)setTagsArray:(NSArray *)tagsArray {
_tagsArray = tagsArray;
// 去掉重复的title
NSSet * set = [NSSet setWithArray:tagsArray];
NSArray * titleArray = [set allObjects];
NSArray *sortDesc = @[[[NSSortDescriptor alloc] initWithKey:nil ascending:YES]];
NSArray *sort1Array = [titleArray sortedArrayUsingDescriptors:sortDesc];
CGFloat tagsWidth = ;
CGFloat tagY = ;
NSMutableArray * frameA = [NSMutableArray array];
for (NSString * title in sort1Array) { //计算出每个标题的Size
CGSize titleSize = [self sizeWithText:title font:[UIFont systemFontOfSize:] maxW:];
[frameA addObject:NSStringFromCGSize(titleSize)];
}
for (NSInteger i = ; i < frameA.count; i ++) {
CGSize size = CGSizeFromString(frameA[i]);
CGFloat width = size.width + self.tagdPadding;
CGFloat height = size.height + self.tagdPadding;
if ((WIDTH - tagsWidth - self.tagsMargin) < (width)) {
tagY = tagY + height + self.tagsLineMargin;
tagsWidth = ;
}
UIButton * btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(self.tagsMargin + tagsWidth, tagY, width, height);
[btn setTitle:sort1Array[i] forState:UIControlStateNormal];
[btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[btn setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected];
btn.titleLabel.font = [UIFont systemFontOfSize:];
btn.layer.masksToBounds = YES;
btn.layer.cornerRadius = ;
btn.layer.borderWidth = ;
btn.layer.borderColor = [UIColor blackColor].CGColor;
[self.tagsFrames addObject:btn];
tagsWidth = CGRectGetMaxX(btn.frame);
if (i == frameA.count - ) {
self.tagsTotalHeight = CGRectGetMaxY(btn.frame) + self.tagsLineMargin;
}
}
} //计算文字的大小 maxW限制最大宽度 maxW 传MAXFLOAT,没有限制最大的宽度
- (CGSize)sizeWithText:(NSString *)text font:(UIFont *)font maxW:(CGFloat)maxW
{
NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
attrs[NSFontAttributeName] = font;
CGSize maxSize = CGSizeMake(maxW, MAXFLOAT); return [text boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size;
} - (void)setTagsMargin:(CGFloat)tagsMargin {
_tagsMargin = tagsMargin;
} - (void)setTagsLineMargin:(CGFloat)tagsLineMargin {
_tagsLineMargin = tagsLineMargin;
} - (void)setTagdPadding:(CGFloat)tagdPadding {
_tagdPadding = tagdPadding;
} @end

展开

LGLTagsView.h

//  Created by 李国良 on 2016/10/17.
// Copyright © 2016年 李国良. All rights reserved.
// #import <UIKit/UIKit.h> typedef void(^TagSelectBlock)(NSString * tagName); @interface LGLTagsView : UIView /**
* @params frame 高度请传 LGLTagsFrame的 tagsTotalHeight
* @params tagsFrame 请传 LGLTagsFrame 的 tagsFrames
*/
- (instancetype)initWithFrame:(CGRect)frame tagsFrame:(NSMutableArray *)tagsFrame selectTagBlock:(TagSelectBlock)block; /*
* @params isSelected 是是否要有选中的效果 默认有选中的效果
*/
@property (nonatomic, assign) BOOL isSelected; /*
* @params tagsSelectedColor 是修改选中tag的背景色颜色(默认 orange) 在没有选中效果的时候设置无效
*/
@property (nonatomic, strong) UIColor * tagsSelectedColor; @end

展开

LGLTagsView.m

//  Created by 李国良 on 2016/10/17.
// Copyright © 2016年 李国良. All rights reserved.
// #import "LGLTagsView.h"
@interface LGLTagsView () @property (nonatomic, strong) NSMutableArray * tagsFrame;
@property (nonatomic, strong) UIButton * startButton;
@property (nonatomic, copy) TagSelectBlock block; @end @implementation LGLTagsView - (instancetype)initWithFrame:(CGRect)frame tagsFrame:(NSMutableArray *)tagsFrame selectTagBlock:(TagSelectBlock)block {
self = [super initWithFrame:frame];
if (self) {
self.tagsFrame = tagsFrame;
self.isSelected = YES;
self.tagsSelectedColor = [UIColor orangeColor];
self.block = block;
[self createTagsView];
}
return self;
} - (void)createTagsView {
for (UIButton * tags in self.tagsFrame) {
[tags addTarget:self action:@selector(tagsClink:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:tags];
}
} - (void)tagsClink:(UIButton *)button {
if (self.isSelected) {
if(button !=self.startButton){
self.startButton.selected = NO;
[self.startButton setBackgroundColor:[UIColor whiteColor]];
self.startButton.layer.borderColor = [UIColor blackColor].CGColor;
self.startButton = button;
}
self.startButton.selected=YES;
if (self.startButton.selected) {
[self.startButton setBackgroundColor:self.tagsSelectedColor];
self.startButton.layer.borderColor = [UIColor whiteColor].CGColor;
}
}
self.block(button.titleLabel.text);
} - (void)setIsSelected:(BOOL)isSelected {
_isSelected = isSelected;
} - (void)setTagsSelectedColor:(UIColor *)tagsSelectedColor {
_tagsSelectedColor = tagsSelectedColor;
} - (NSMutableArray *)tagsFrame {
if (!_tagsFrame ) {
_tagsFrame = [NSMutableArray array];
}
return _tagsFrame;
}
@end

展开

文件到此结束

下面说明一下具体使用的方法:

 LGLTagsFrame * frame = [[LGLTagsFrame alloc] init];
frame.tagsArray = [dataSource copy];
LGLTagsView * tagView = [[LGLTagsView alloc] initWithFrame:CGRectMake(, , WIDTH, frame.tagsTotalHeight) tagsFrame:frame.tagsFrames selectTagBlock:^(NSString *tagName) {
// 在这里获得标签的点击回调的值
}
}];
[self.view addSubview:tagView];

有修改意见的欢迎来骚扰!

LGLTagsView的更多相关文章

随机推荐

  1. HTML基础笔记-01

    ---恢复内容开始--- 学习网站:W3School 1.基础知识 目录: <1.我的文档—> 选择目录名—> 主页—> 样式(点击标题样式,选择你想要的每个标题,重复此步骤) ...

  2. 最新hadoop+hbase+spark+zookeeper环境安装(vmmare下)

    说明:我这里安装的版本是hadoop2.7.3,hbase1.2.4,spark2.0.2,zookeeper3.4.9 (安装包:链接:http://pan.baidu.com/s/1c25hI4g ...

  3. Mybatis 缓存

    1. 一级缓存:其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空. 2. 二级缓存与一级缓存其机制相同,不同在于其存 ...

  4. KlayGE 4.4中渲染的改进(四):SSSSS

    转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2774 本系列的上一篇提到了KlayGE 4.4将会出现的高质量地形渲染.本篇仍讲一个新功能, ...

  5. poj2253 Frogger(最短路变型或者最小生成树)

    /* 题意:就是源点到终点有多条的路径,每一条路径中都有一段最大的距离! 求这些路径中最大距离的最小值! Dijkstra, Floyd, spfa都是可以的!只不过是将松弛的条件变一下就行了! 想了 ...

  6. NYOJ 99单词拼接(有向图的欧拉(回)路)

    /* NYOJ 99单词拼接: 思路:欧拉回路或者欧拉路的搜索! 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 有向图的欧拉路:abs(In[i ...

  7. Spring学习总结(四)——表达式语言 Spring Expression Language

    SpEL简介与功能特性 Spring表达式语言(简称SpEL)是一个支持查询并在运行时操纵一个对象图的功能强大的表达式语言.SpEL语言的语法类似于统一EL,但提供了更多的功能,最主要的是显式方法调用 ...

  8. android用讯飞实现TTS语音合成 实现中文版

    Android系统从1.6版本开始就支持TTS(Text-To-Speech),即语音合成.但是android系统默认的TTS引擎:Pic TTS不支持中文.所以我们得安装自己的TTS引擎和语音包. ...

  9. [转载]UML类图总结

    前言 类图和序列图是UML中最常用的两种Diagram.我将做详细的总结.在许多书中,或者网站中,在介绍一个系统的子系统的设计时,很多时候,都是给出简单的类图来简述构成子系统的类之间的关系.这足以说明 ...

  10. 《HelloGitHub月刊》第05期

    <HelloGitHub>第05期 兴趣是最好的老师,<HelloGitHub>就是帮你找到兴趣! 欢迎各路人士加入本项目,丰富月刊的内容,也可以直接在Issue(需要登录gi ...