惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hacker News: Ask HN
Hacker News: Ask HN
IT之家
IT之家
S
SegmentFault 最新的问题
T
Tailwind CSS Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
J
Java Code Geeks
博客园 - 聂微东
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
The Cloudflare Blog
博客园_首页
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 【当耐特】
腾讯CDC
Apple Machine Learning Research
Apple Machine Learning Research
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
宝玉的分享
宝玉的分享
小众软件
小众软件
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
月光博客
月光博客
NISL@THU
NISL@THU
T
The Exploit Database - CXSecurity.com
C
CXSECURITY Database RSS Feed - CXSecurity.com
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
Blog — PlanetScale
Blog — PlanetScale
aimingoo的专栏
aimingoo的专栏
L
LINUX DO - 热门话题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
F
Fortinet All Blogs
博客园 - Franky
L
Lohrmann on Cybersecurity
S
Secure Thoughts
量子位
V
Vulnerabilities – Threatpost
Last Week in AI
Last Week in AI
博客园 - 叶小钗
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
LINUX DO - 最新话题
I
InfoQ
C
CERT Recently Published Vulnerability Notes
Security Archives - TechRepublic
Security Archives - TechRepublic
P
Proofpoint News Feed
G
GRAHAM CLULEY
Cisco Talos Blog
Cisco Talos Blog

博客园 - Leepy

AI应用平台搭建之旅(上) - 框架篇(附:AICon大会阿里国际Agent应用平台分享) 阿里巴巴LangEngine开源了!支撑亿级网关规模的高可用Java原生AI应用开发框架 在mac上安装Go语言初体验 iOS学习系列 - UITableView下拉更新/上提加载的实现 iOS学习系列 - MonoTouch绑定原生Obj-C静态库的实现 iOS学习系列 - 在iOS客户端实现google oauth2登录以及在asp.net服务端上form认证 iOS学习系列 - 利用ASIHTTPRequest实现异步队列 iOS学习系列 - 扩展机制category与associative Wind.js在移动跨平台框架PhoneGap中的异步体验 Mono for Andriod学习与实践(1)— 初体验 阿里技术嘉年华官网上线啦! Silverlight实现对Sql Server Profiler的SQL实时监控 利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习) Silverlight 4以下版本模拟鼠标双击事件 利用Nginx+Mono+Fastcgi代替IIS对Asp.Net进行反向代理 Thrift初探:简单实现C#通讯服务程序 对于.Net中C#指针的研究 各大主流.Net的IOC框架性能测试比较 依赖注入框架Autofac的简单使用
iOS学习系列 - 标签Tag列表的实现
Leepy · 2012-10-22 · via 博客园 - Leepy

本文讲述如何实现一个标签Tag列表的效果。

在iOS项目中的效果为图上所示:

在各个任务下,包括对应的标签列表。

首先,自定义一个UILabel类:

FillLabel.h:

#import <UIKit/UIKit.h>
@interface FillLabel : UILabel
@end

FillLabel.m

#import "FillLabel.h"
 
#define MAX_SIZE_HEIGHT 10000
#define DEFAULT_BACKGROUDCOLOR [UIColor colorWithRed:47.0/255 green:157.0/255 blue:216.0/255 alpha:1]
#define DEFAULT_TEXTCOLOR [UIColor whiteColor]
#define DEFAULT_FONT [UIFont boldSystemFontOfSize:10]
#define DEFAULT_TEXTALIGNMENT UITextAlignmentCenter
#define DEFAULT_RADIUS 5.0f
 
@implementation FillLabel
 
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
 
        self.backgroundColor = DEFAULT_BACKGROUDCOLOR;
        self.textColor = DEFAULT_TEXTCOLOR;
        self.font = DEFAULT_FONT;
        self.textAlignment = DEFAULT_TEXTALIGNMENT;
 
        self.layer.masksToBounds = YES;
        self.layer.cornerRadius = DEFAULT_RADIUS;
 
    }
    return self;
}
 
-(void)setRadius:(CGFloat)radius
{
    self.layer.cornerRadius = radius;
}
 
-(void)setText:(NSString *)text
{
    super.text = text;
 
    CGSize size = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(320, MAX_SIZE_HEIGHT) lineBreakMode:UILineBreakModeWordWrap];
    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, size.width + 8, size.height);
}
 
@end

在使用CALayer的时候,必须引入QuartzCore.framework框架,这样就可以实现label的一些效果:

self.layer.masksToBounds = YES;
self.layer.cornerRadius = DEFAULT_RADIUS;

其中cornerRadius用来控制Label的圆角半径;

另外,看到setText:这个方法,当对该Label进行文本赋值的时候,通过sizeWithFont对Label计算相关尺寸,并对frame进行重新调整;

现在,实现一个包括Tag列表的容器,假定这儿自定义一个UIView类:

FillLabelView.h:

#import <UIKit/UIKit.h>
@interface FillLabelView : UIView
- (void)bindTags:(NSMutableArray*)tags;
@end

FillLabelView.m:

#import "FillLabelView.h"
#import "FillLabel.h"
 
@implementation FillLabelView
 
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
    }
    return self;
}
 
- (void)bindTags:(NSMutableArray*)tags
{
    CGFloat frameWidth = self.frame.size.width;
 
    CGFloat tagsTotalWidth = 0.0f;
    CGFloat tagsTotalHeight = 0.0f;
 
    CGFloat tagHeight = 0.0f;
    for (NSString *tag in tags)
    {
        FillLabel *fillLabel = [[FillLabel alloc] initWithFrame:CGRectMake(tagsTotalWidth, tagsTotalHeight, 00)];
        fillLabel.text = tag;
        tagsTotalWidth += fillLabel.frame.size.width + 2;
        tagHeight = fillLabel.frame.size.height;
 
        if(tagsTotalWidth >= frameWidth)
        {
            tagsTotalHeight += fillLabel.frame.size.height + 2;
            tagsTotalWidth = 0.0f;
            fillLabel.frame = CGRectMake(tagsTotalWidth, tagsTotalHeight, fillLabel.frame.size.width, fillLabel.frame.size.height);
            tagsTotalWidth += fillLabel.frame.size.width + 2;
        }
        [self addSubview:fillLabel];
        [fillLabel release];
    }
    tagsTotalHeight += tagHeight;
 
    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, tagsTotalHeight);
}
 
@end

其中,有个bindTags:方法,该方法接受一个MSMutableArray数组的绑定,讲数组中的文本,放入到该容器中,并且通过计算,重新得到另外尺寸的frame.

然后,对FillLabelView进行调用:

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"web",@"hybrid",@"native",@"leepy",@"sunleepy",nil];
 
    FillLabelView *fillLabelView = [[FillLabelView alloc] initWithFrame:CGRectMake(1010120100)];
    fillLabelView.layer.borderWidth = 1.0f;
    fillLabelView.layer.borderColor = [[UIColor blueColor] CGColor];
    [fillLabelView bindTags:array];
    [self.view addSubview:fillLabelView];
    [fillLabelView release];

最终效果:

容器中,做了最后的尺寸调整。

Demo下载地址:https://github.com/sunleepy/iOS_Lab