根据NSString字符串长度自动改变UILabel的frame
相信大家都遇到过这种需求。如果一个不慎,容易做成这个模样:

话不多说,上代码。
1.首先,设置UILabel的相关属性
UILabel *tmpLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 200, [UIScreen mainScreen].bounds.size.width - 20, 20)];
[tmpLabel setNumberOfLines:];
[self.view addSubview:tmpLabel];
就这些?就这些。只需要初始化,只需要设置行数为0,也就是行数无上限(自动换行)就可以添加到父视图上了。其他的UILabel的属性你想设置就设置,不想设置就设置上面这些就可以。
2.根据字符串NSString获得UILabel的frame
2.1 UILabel宽度不变,改变高度
//宽度不变,根据字的多少计算label的高度
NSString *str = @"可以更改此内容进行测试,宽度不变,高度根据内容自动调节";
CGSize size = [str sizeWithFont:tmpLabel.font constrainedToSize:CGSizeMake(tmpLabel.frame.size.width, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping];
//根据计算结果重新设置UILabel的尺寸
[tmpLabel setFrame:CGRectMake(tmpLabel.frame.origin.x,tmpLabel.frame.origin.y, size.height, size.height)];
[tmpLabel setText:str];
使用sizeWithFont方法来获得CGSize。其中,宽度我们设置为我们UILabel的width;高度设置为MAXFLOAT,一个宏,代表CGFloat最大值;lineBreakMode设置为NSLineBreakByWordWrapping。这样就可以设置UILabel宽度不变,高度根据NSString改变了。
2.2 UILabel高度不变,改变宽度
//高度固定不折行,根据字的多少计算label的宽度
NSString *str = @"高度不变获取宽度,获取字符串不折行单行显示时所需要的长度";
CGSize size = [str sizeWithFont:label.font constrainedToSize:CGSizeMake(MAXFLOAT, label.frame.size.height)];
//根据计算结果重新设置UILabel的尺寸
5 [label setFrame:CGRectMake(tmpLabel.frame.origin.x,tmpLabel.frame.origin.y, size.width, size.height)];
label.text = str;
同样的设置。唯一的不同在于我们不需要设置折行模式了。这样就设置成为UILabel高度不变,改变宽度了。
3.如果是iOS7.0之后,它会提示你sizeWithFit这个方法被废弃了。提示我们使用下面的方法替代:
//宽度不变,根据字的多少计算label的高度
NSString *str = @"可以更改此内容进行测试,宽度不变,高度根据内容自动调节";
CGSize textSize = [str boundingRectWithSize:CGSizeMake(tmpLabel.frame.size.width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:tmpLabel.font} context:nil].size;
改为boundingRectWithSize这个方法来改变字符串长度。通过更改options的参数NSStringDrawingOptions来决定是高固定改变宽度还是宽固定改变高度。
根据NSString字符串长度自动改变UILabel的frame的更多相关文章
- iOS UILabel根据字符串长度自动适应宽度和高度
//这个frame是初设的,没关系,后面还会重新设置其size. UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0,0, ...
- 扩展entity framework core 实现默认字符串长度,decimal精度,entity自动注册和配置
报道越短,事情越严重!文章越短,内容越精悍! 文章以efcore 2.0.0-preview2.测试验证通过.其他版本不保证使用,但是思路不会差太远.源代码 目标: 1.实现entity的自动发现和m ...
- NSString字符串
要把 “2011-11-29” 改写成 “2011/11/29”一开始想用ios的时间格式,后来用NSString的方法搞定. [string stringByReplacingOccurrences ...
- iOS - OC NSString 字符串
前言 @interface NSString : NSObject <NSCopying, NSMutableCopying, NSSecureCoding> @interface NSM ...
- NSString 字符串
0.字符串常用操作 自动补充方法:当字符串长度不够需要自动补充到一定的位数 OC字符串与C语言字符串之间的相互转换 1.不可变字符串的创建 // 直接创建不可变字符串 /* 在 OC 中,使用 @&q ...
- iOS小知识:计算字符串长度(如果有表情,表情的长度为1)
在做项目的时候,textField能够输入表情,但是iOS的表情是占两个字符的,再计算字符串长度的时候就和想象的不一样了,所以用了次方法会将表情的长度转成1,最后得到的字符串的长度就是能看到的实际的长 ...
- Swift3.0语言教程获取字符串长度
Swift3.0语言教程获取字符串长度 Swift3.0语言教程获取字符串长度,当在一个字符串中存在很多的字符时,如果想要计算字符串的长度时相当麻烦的一件事情,在NSString中可以使用length ...
- 字符串长度函数strlen()
如下是我的测试文件: #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { ...
- objective-c中字符串长度计算
我们知道,在c语言中,使用sizeof ()计算在内存中占用的字节数, 引用string.h后,使用strlen()计算字符串的长度(不包含\0). 而在object-c中, "length ...
随机推荐
- java 打开浏览器 url
public class openBrowers { public static void main(String[] args) { try { //String url = "http: ...
- #大数加减乘除#校赛D题solve
#include<iostream> #include<cstdio> #include<cstring> #include<string> #incl ...
- [ mysql优化一 ] explain解释select语句
NOSQL 没有什么数据表, 只是一些变量,key_value ,redis 支持的变量比较多.可以持久化文件到硬盘上. mysql 关系型数据库 ,表和表中间有各种id的关系. 缺点 高并发读 ...
- WWW 资源下载与表单提交
在注册与验证用户信息,以及非即时通信的游戏中,我们可以使用WWW类使用短链接来完成客户端与服务器数据的通信,今天我们将使用用POST方法来完成的用户注册与登录,在最后介绍下其它资源的加载. 首先使用P ...
- Python基础知识学习_Day2
一.for循环 1.1功能及语法 for循环是迭代循环机制(while是条件循环),语法如下: for i in a b c: print(i) 1.2典型例子: 1.2.1猜年龄循环 realy_a ...
- lucene 多字段查询-MultiFieldQueryParser
/** * 搜索域加权 */ Map<String, Float> boosts = new HashMap<>(); boosts.put("title" ...
- Oracle SQL 关键字
1.UID返回标识当前用户的唯一整数SQL> show userUSER 为"GAO"SQL> select username,user_id from dba_use ...
- vs2013 中已经添加了引用,编译还是提示没有添加引用
背景:在项目中需要引用wps中的etapi.dll.下载一个wps后,在项目中添加引用后. 同时在工程中使用using命令可以自动搜索进行添加该应用.但是,编译还是通不过.提示找不到excel.在网上 ...
- 阿里云 CentOS7.2 配置FTP+Node.js环境
本人小白,写下这篇博客意在记录踩过的坑,大神请绕道~ 准备工作 安装自己喜欢的连接软件(一般是putty或者xshell),本人选择的是xshell,软件如图 : 通过软件中的ssh连接连接上已经购买 ...
- c++中小项堆声明和使用【转】
c++默认是大顶堆,小顶堆有两种声明方法: 1.对于基本类型直接用 priority_queue<int, vector<int>, greater<int> >p ...