iOS7.0中UILabel高度调整注意事项

转自:http://blog.csdn.net/k12104/article/details/33731833

http://herkuang.info/blog/2013/12/31/ios7%E4%B8%ADuilabel%E9%AB%98%E5%BA%A6%E8%B0%83%E6%95%B4%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9/

我的“记词助手”在升级到iOS7之后,一直出现UILabel错位的问题:

我的label是用- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode 来计算的,但是似乎计算得不是很正确。

实际上UILabel的frame是红框的大小,但是在宽度不够的时候,不知道触发了什么bug,这个Label在绘制的时候文字会被挤下去。这个问题到底是什么,我也没搞清楚,但是增加UILabel的宽度后,就会显示正常。

在跟了一遍代码后发现,在iOS7下面,- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode这个函数返回的值是带小数的,设给UILabel的frame之后,UILabel的宽度就小于文字绘制需要的宽度了。就会造成上面的问题。

在官方文档里可以看到,- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode这个函数在iOS7里面已经deprecated了,取而代之的是boundingRectWithSize:options:attributes:context:这个函数。实际上这两个函数在iOS7里面的计算结果是一致的,都是带小数的。boundingRectWithSize:options:attributes:context:的文档中可以看到这么一句话:

This method returns fractional sizes (in the size component of the returned CGRect); to use a returned size to size views, you must use raise its value to the nearest higher integer using the ceil function.

也就是说,计算出的size需要用ceil函数取整。

在iOS7中,正确地计算UILabel可能占有的高度需要如下的步骤:

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
NSDictionary *attributes = @{NSFontAttributeName:someFont, NSParagraphStyleAttributeName:paragraphStyle.copy};
        
labelSize = [someText boundingRectWithSize:CGSizeMake(207, 999) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil].size;
/*
         This method returns fractional sizes (in the size component of the returned CGRect); to use a returned size to size views, you must use raise its value to the nearest higher integer using the ceil function.
         */
labelSize.height = ceil(labelSize.height);
labelSize.width = ceil(labelSize.width);

时间: 2024-08-10 01:51:42

iOS7.0中UILabel高度调整注意事项的相关文章

IOS 6.0+ Autolayout — UITableViewCell 高度调整

要实现的效果 要求: storyboard上的准备工作 建好cell自定义AutoCell 类,关联好控件,事先准备好一些数据源 实现tableview的委托方法 核心部分,HeightForRow方法实现 具体的计算高度方法是现在自定义cell类中 几大需要注意的地方 在ios6.0上测试 要实现的效果 要求: 一般titleLabel 仅显示一行标题,高度为固定. imageview 大小也为固定. detailLabel 宽度固定,但高度根据文本动态调整. cell 底部拒imagevie

IOS7.0 UILabel实现自适应高度的新方法

//IOS7.0中利用- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context 方法可以获取label的Size大小,来自适应高度,取代了之前的- (CGSize)sizeWithFont:(UIFont *)font const

iOS7中Cell高度 Label高度自适应

? 1 2 3 4 5 6 7 8 9 10 11 12 ?- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{     NSString *str = [_dataArray objectAtIndex:indexPath.row];     UIFont *tfont = [UIFont systemFontOfSize:14.0];     NSDictio

计算改变行间距的UILabel高度

有人碰到同样的需求吗?有什么比较好的实现吗? 一段文字 需要改变行间距 还需要计算出高度调整位置 /**  _str :         要现实的字符串  _font :        字体  _labWidth :    Lab最大宽度  _lineSpacing : 行间距  _numberOfLines :   显示行数  */ +(CGSize)labSizeWithStr:(NSString *)_str font:(UIFont *)_font labWidth:(int)_labW

Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制--转载

多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 ——synchronized 和 volatile .在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使它变得更容易了. synchronized 快速回顾 把代码块声明为 synchronized,有两个重

HBase2.0中的Benchmark工具 — PerformanceEvaluation

简介 在项目开发过程中,我们经常需要一些benchmark工具来对系统进行压测,以获得系统的性能参数,极限吞吐等等指标. 而在HBase中,就自带了一个benchmark工具-PerformanceEvaluation,可以非常方便地对HBase的Put.Get.Scan等API进行性能测试,并提供了非常丰富的参数来模拟各种场景. 这篇文章,就以HBbase2.0中的PerformanceEvaluation工具为例,给大家讲解一下这款HBase benchmark工具的使用和注意事项 参数介绍

小改动,大作为——C# 4.0中的微小改动

1.可选参数和命名实参 可选参数和命名实参就如同一对好基友,因为它们经常一起使用. 1.1 可选参数 可选参数重在“可选”,即在调用方法时,该参数可以明确指定实参,也可以不指定.如下代码所示,下面代码就包含3个参数,一个必备参数和两个可选参数. 1 static void TestMethod(int x,int y=10,string name="LearningHard") 2 { 3 Console.WriteLine($"x={x} y={y} name={name}

ios 根据文字数量计算UILabel高度

以前封装过多个关于实现此功能的方法,虽然都实现了效果,但代码和实现思路都相对复杂很多,而且并不比我下面要说的这个方法好,这个也是我今天突发奇想来的,测量一下字体的宽度,然后根据这个点来计算 UILabel高度.这里我使用的FontSize是13,我测出它的高度.宽度都是15像素,如果你使用其他号字体,需要自己从新测下字体宽度.高度,下面贴出代码. 一.实现代码 //申明时的label的高度可以随便设置,因为之后计算出高度后还需要从设置一次 UILabel *label = [[UILabel a

office2003+photoshop8.0+flash8.0的安装步骤及注意事项

如果你的系统之前安装有office程序,请先卸载后再安装office2003. 卸载工具下载地址:http://pan.baidu.com/s/1i4ZDQWP 1.点击下载地址: http://pan.baidu.com/s/1nu81s5V 下载office2003安装包后如图: 2.双击此exe安装包,如图: 3.会出现以下界面:点击“下一步” 4.点击“完全安装”: 5.点击下一步后会出现:点击“安装”即可 6.安装过程中: 7.安装进度条走完后点击“完成”: 8.安装后桌面上会出现wo