ios开发笔记根据传入字符串的长度动态生成label,并按照屏幕宽度排列

在开发工作中遇到了一个对我来说非常难得问题,搞了两天呀,都虚脱了,终于骗到大神给的demo做了出来效果是这样

首先后台的同事传一个字符串。。拒绝传数组,那么我们就要学会分割!

NSString *tagStr = [dictionary valueForKey:@"tags"];

NSArray *statusArray = [tagStr componentsSeparatedByString:@","];

这个就是把字符串按照符号分割数组的方法,接下来我们就可以根据内容动态生成标签了;
这是用到的宏:

#define FONT_SIZE 13.0f

#define HORIZONTAL_PADDING 7.0f

#define VERTICAL_PADDING 3.0f

#define CORNER_RADIUS 10.0f

#define LABEL_MARGIN 5.0f

#define BOTTOM_MARGIN 5.0f

#define BACKGROUND_COLOR UIColorFromRGB(0x04, 0x9f, 0xf1)

//[UIColor colorWithRed:0.93 green:0.93 blue:0.93 alpha:1.00]

#define TEXT_COLOR [UIColor whiteColor]

#define TEXT_SHADOW_COLOR [UIColor whiteColor]

#define TEXT_SHADOW_OFFSET CGSizeMake(0.0f, 1.0f)

#define BORDER_COLOR [UIColor lightGrayColor].CGColor

#define BORDER_WIDTH 1.0f

这是代码:

if (tagStr.length > 0)//判断一下有值才生成

{

float totalHeight = 0;//

CGRect previousFrame = CGRectZero;

BOOL gotPreviousFrame = NO;//检查是否有前一个标签

for (NSString *text in statusArray)

{

CGSize textSize = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:CGSizeMake(self.frame.size.width, 1500) lineBreakMode:UILineBreakModeWordWrap];//动态获取字符串长度

textSize.width += HORIZONTAL_PADDING*2;

textSize.height += VERTICAL_PADDING*2;

UILabel *label = nil;

if (!gotPreviousFrame)

{

label = [[UILabel alloc] initWithFrame:CGRectMake(0, 5, textSize.width, textSize.height)];

totalHeight = textSize.height;

}

else

{

CGRect newRect = CGRectZero;

if (previousFrame.origin.x + previousFrame.size.width + textSize.width + LABEL_MARGIN > self.frame.size.width) {

newRect.origin = CGPointMake(0, previousFrame.origin.y + textSize.height + BOTTOM_MARGIN);

totalHeight += textSize.height + BOTTOM_MARGIN;

}

else

{

newRect.origin = CGPointMake(previousFrame.origin.x + previousFrame.size.width + LABEL_MARGIN, previousFrame.origin.y);

}

newRect.size = textSize;

label = [[UILabel alloc] initWithFrame:newRect];

}

previousFrame = label.frame;

gotPreviousFrame = YES;

[label setFont:[UIFont systemFontOfSize:FONT_SIZE]];

if (!lblBackgroundColor)

{

[label setBackgroundColor:BACKGROUND_COLOR];

} else

{

[label setBackgroundColor:lblBackgroundColor];

}

[label setTextColor:TEXT_COLOR];

[label setText:text];

[label setTextAlignment:UITextAlignmentCenter];

//                [label setShadowColor:TEXT_SHADOW_COLOR];

//                [label setShadowOffset:TEXT_SHADOW_OFFSET];

[label.layer setMasksToBounds:YES];

[label.layer setCornerRadius:CORNER_RADIUS];

[label.layer setBorderColor:BORDER_COLOR];

[label.layer setBorderWidth: BORDER_WIDTH];

[_CorpTagView addSubview:label];

}

sizeFit = CGSizeMake(self.frame.size.width, totalHeight + 1.0f);//这个我一直不知道什么作用,抄来的O(∩_∩)O哈哈~

}

时间: 2024-10-20 17:52:48

ios开发笔记根据传入字符串的长度动态生成label,并按照屏幕宽度排列的相关文章

iOS开发笔记系列-基础3(多态、动态类型和动态绑定)

多态:相同的名称,不同的类 使不同的类共享相同方法名称的能力成为多态.它让你可以开发一组类,这组类中的每一个类都能响应相同的方法名.每个类的定义都封装了响应特定方法所需要的代码,这使得它独立于其他的类定义.这是因为Objective-C的运行时系统在执行方法时知道消息的接收者是哪个类的对象,它总是携带有关“一个对象属于哪个类”这样的信息,该信息能使系统在运行时做出决定,而不是在编译时. 动态绑定和id类型 id数据类型是一种通用的对象类型,可以用来存储属于任何类的对象.当使用id类型的时候,程序

李洪强iOS开发Swift篇—03_字符串和数据类型

李洪强iOS开发Swift篇—03_字符串和数据类型 一.字符串 字符串是String类型的数据,用双引号""包住文字内容  let website = "http://www.wendingding.com" 1.字符串的常见操作 (1)用加号 + 做字符串拼接 let scheme = "http://" let path = “www.wendingding.com” let website = scheme + path // websi

IOS开发笔记-百度地图(第三方库)

最近做了百度地图,在导入SDK后遇到了一些问题 编译错误: linker command failed with exit code 1 (use -v to see invocation) 想了很多办法,查了很多资料,最后终于解决. 可能原因: 1. 有重复的.m文件,或者未导入 解决办法:有重复的删除即可 在工作左边导航栏Target-->Build Phases-->compile Sources中,第三库库的所有.m文件都添加到里面 2.Valid Architectures 的值 在

ios开发笔记----exc_bad_access(code=1, address=0x789870)野指针错误,假死debug状态

错误原因: exc_bad_access(code=1, address=0x789870)野指针错误,主要的原因是,当某个对象被完全释放,也就是retainCount,引用计数为0后.再去通过该对象去调用其它的方法就会出现野指针错误. 例如: Person *jerry = [[Person alloc]init];  //  retainCount引用计数为1 [jerry eat];  //  调用吃的方法 [jerry release];  //  释放jerry这个对象到 retain

iOS开发笔记-两种单例模式的写法

iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" static ServiceManager *defaultManager; @implementation ServiceManager +(ServiceManager *)defaultManager{ if(!defaultManager) defaultManager=[[self allocWith

[IOS 开发] NSDateFormatter的格式字符串 -- 《整理的笔记》

在ios开发中, OBjective-C中的NSDate是一个挺讨厌的类型, 自己找不到转换成字符串的类型,还得带一个NSDateFormatter的类型. 官方文档上对NSDateFormatter的格式串好像没详讲, 或许有,我没找到, 每次使用都是用谷歌摸索.有幸找到一份比较全的文档, 翻译过来共享: a: AM/PM (上午/下午)A: 0~86399999 (一天的第A微秒)c/cc: 1~7 (一周的第一天, 周天为1)ccc: Sun/Mon/Tue/Wed/Thu/Fri/Sat

【IOS开发笔记02】学生管理系统

端到端的机会 虽然现在身处大公司,但是因为是内部创业团队,产品.native.前端.服务器端全部坐在一起开发,大家很容易做零距离交流,也因为最近内部有一个前端要转岗过来,于是手里的前端任务好像可以抛一大坨出去了,这个时候立刻想到了切入IOS开发!!! 事实上,前端开发做到一定时间,要进步很难了,最近几个月扑到业务上便感觉突破不了目前的瓶颈,自身的前端瓶颈主要在两方面:技术深度.技术广度 其实不论深度或者广度来说都不是简单前端能说清楚的事情,不能说了解了angularJS.react等框架技术深度

iOS开发笔记 - 语言篇之Swift

?2014年的苹果全球开发者大会(WWDC),当Craig Federighi向全世界宣布"We have new programming language"(我们有了新的编程语言)的时候,全场响起了最热烈和持久的掌声,伴随着掌声到来的语言叫Swift.接下来Craig Federighi更是毫不掩饰的告诉大家,Swift将成为主宰iOS和Mac开发的新语言,甚至是整个软件行业中最举足轻重的语言. ??Swift正如它的名字那样迅速.敏捷,但这并不是它的全部.Swift是一个博采众长的

iOS开发笔记 - 网络篇

计算机网络基础 ??计算机网络是多台独立自主的计算机互联而成的系统的总称,最初建立计算机网络的目的是实现信息传递和资源共享. ??如果说计算机是第二次世界大战的产物,那么计算机网络则是美苏冷战的产物.20世纪60年代初期,美国国防部领导的ARPA提出研究一种崭新的.能够适应现代战争的.生存性很强的通信系统并藉此来应对苏联核攻击的威胁,这个决定促使了分组交换网的诞生,也奠定今天计算机网络的原型,这是计算机网络发展史上第一个里程碑式的事件. ??第二个里程碑式的事件是20世纪80年代初,国际标准化组