做项目的时候经常会用到标签,比如说现在很多项目中搜索历史用标签展示 和 选择某个产品的不同属性用标签展示...。网上的有很多封装好的标签,但是作为一个上进的程序员,都希望能有一个自己写的。其实也是一种积累知识的过程。现在的这个标签是根据你的标签的搜字母来排序的。下载地址: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. [Spring框架]Spring JDBCTmplate基础入门总结.

    前言:前面有讲过 Spring IOC以及AOP的基本使用方法, 这里就再来讲下Spring JDBCTemplate的使用方法. 一, 概述这里先说一下Spring 整合的一些模板: 从上图中可以看 ...

  2. BugHD for JavaScript上线,轻松收集前端 Error

    从收集 APP 崩溃信息到全面收集网站出现的 Error,现在的 BugHD 变得更加强大.目前,BugHD JS Error 收集功能 已正式上线,前端 er 们不用再面对一堆 Bug 无处下手. ...

  3. 无服务端纯前台导出数据到Excel-JSExcelXML.js 使用指南

    JSExcelXML 使用指南 先来个效果预览 a.前端显示 b.导出excel效果 表头部分 表尾部分 1.功能描述 JsExcelXml 采用js生成excel中可显示的xml格式文本,将输出文本 ...

  4. [java]输入一个算术表达式输出结果

    动手有益. 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形.例如:  输入:3+8×2/9-2  输出:2 /** * input a calculate stri ...

  5. android TextView 文字垂直的设置

    <TextView android:id="@+id/tv_status" android:layout_width="wrap_content" and ...

  6. 快速入门系列--WCF--05事务

    最近开始WCF相关知识的学习,虽然实际工作中使用公司自己的一套SOA系统,但微软的一套服务架构还是具有很大的参考意义.除了WCF的一些基础使用,相对比较复杂的内容有分布式的事务和通信的安全等,不过基本 ...

  7. java中异常注意的细节2

    class A extends Exception{ A(){ super(); } A(String msg){ super(msg); } } class B extends A{ B(){ su ...

  8. ASP.NET MVC 4中如何为不同的浏览器自适应布局和视图

    在ASP.NET MVC 4中,可以很简单地实现针对不同的浏览器自适应布局和视图.这个得归功于MVC中的"约定甚于配置"的设计理念. 默认的自适应 MVC 4自动地为移动设备浏览器 ...

  9. 使用SQL Server作业设置定时任务

    1.开启SQL Server Agent服务 使用作业需要SQL Agent服务的支持,并且需要设置为自动启动,否则你的作业不会被执行. 以下步骤开启服务:开始-->>>运行--&g ...

  10. [转载]AxureRP学习成长之路

    [编者按]本文作者@朱军华Ronzhu , 本文借用官网的描述定义,介绍了在学习AxureRP过程当中所要经历的各个阶段,也结合了作者自身学习AxureRP使用的经验,讲一下在各个阶段中的一些学习方法 ...