UILabel的一些用法

来源:互联网 发布:java list 获取第一个 编辑:程序博客网 时间:2024/05/21 09:50

1.已经废弃的方法和它的替代方法

1.1 CGSize fontSize =[self.text sizeWithFont:self.font];
字符串调用该方法时,根据当前的字体计算出一行字需要的size。可以得到一行字需要的高。7.0后被弃用。替代的方法:
CGSize fontSize =[self.text sizeWithAttributes:@{NSFontAttributeName:self.font}];
1.2
CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];
已经被弃用。替代的方法:
CGRect frame =[self.text boundingRectWithSize:CGSizeMake(self.frame.size.width, self.frame.size.height) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.font} context:nil];

2.boundingRectWithSize:options:attributes:的用法

参数详解可以参考此文
在IOS开发中例如微博,QQ聊天界面中要显示大量的文字信息,这样需要计算出文字部分的尺寸,才能设计出合适的控件尺寸和位置。下面是IOS 7.0计算文本尺寸的方法。
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary )attributes context:(NSStringDrawingContext )context NS_AVAILABLE_IOS(7_0);
这是NSString的对象方法,一个字符串实例调用该方法时,方法会通过传入的参数返回一个CGRect型数据,这个数据的size就是此时字符串显示成文本的尺寸。
size:限制尺寸,用于计算文本绘制时占据的矩形块,例如微博开发中size.w不超过scence.w。可以将size.y设置为无限大MAXFLOAT以便于显示所有文字内容。
option:文本绘制时的附加选项。有四种类型。
1.NSStringDrawingTruncatesLastVisibleLine 2.NSStringDrawingUsesLineFragmentOrigin
3. NSStringDrawingUsesFontLeading
4. NSStringDrawingUsesDeviceMetrics

NSStringDrawingUsesLineFragmentOrigin
绘制文本时使用 line fragement origin 那么整个文本将以每行组成的矩形为单位计算整个文本的尺寸。 而不是 baseline origin。
Theorigin specified when drawing the string is the line fragment origin and notthe baseline origin.
NSStringDrawingUsesFontLeading
计算行高时使用行间距。(译者注:字体大小+行间距=行高)
NSStringDrawingUsesDeviceMetrics
计算布局时使用图元字形(而不是印刷字体)。

通常使用NSStringDrawingUsesLineFragmentOrigin,如果options参数为NSStringDrawingUsesLineFragmentOrigin,那么整个文本将以每行组成的矩形为单位计算整个文本的尺寸。 但需指定label.numberOfLines = 0;

NSStringDrawingTruncatesLastVisibleLine
如果文本内容超出指定的矩形限制,文本将被截去并在最后一个字符后加上省略号。如果指定NSStringDrawingUsesLineFragmentOrigin选项,则该选项被忽略。
注意: 为了计算文本块的大小,该方法采用默认基线即默认为只有一行。
如果 NSStringDrawingUsesLineFragmentOrigin未指定,矩形的高度将被忽略,同时使用单线绘制 即 返回时只返回一行的高度 大概为15.9 。(在 iOS6 中,宽度会被忽略)

attributes:将文本UIFront存入字典传到这里。例如, NSDictionary *dict = @{NSFontAttributeName : font}
context:context上下文。包括一些信息,例如如何调整字间距以及缩放。最终,该对象包含的信息将用于文本绘制。该参数可为 nil 。

3.动态计算label的大小

3.1 当只有一行时。可以用sizeToFit

UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(10,30,0,0)];
label.backgroundColor=[UIColor yellowColor];
NSString *str=@"哈哈哈哈哈哈哈哈哈哈哈哈哈哈";
label.numberOfLines = 0;
label.font =[UIFont systemFontOfSize:15];
label.text = str;
[label sizeToFit];
[self.view addSubview:label];

3.2 当多行时用boundingRectWithSize:options:attributes:计算出字符串需要的大小。

UILabel *label=[UILabel new];label.backgroundColor=[UIColor yellowColor];NSString *str=@"哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈";label.font =[UIFont systemFontOfSize:15];label.numberOfLines = 0;//CGRect frame=[str boundingRectWithSize:CGSizeMake(200, MAXFLOAT) options:NSStringDrawingTruncatesLastVisibleLine attributes:@{NSFontAttributeName:label.font} context:nil];//未指定NSStringDrawingUsesLineFragmentOrigin,使用单线绘制默认只有一行,返回单行的高度 这里frame.size.height返回17.9CGRect frame=[str boundingRectWithSize:CGSizeMake(200, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:label.font} context:nil];NSLog(@"%f",frame.size.height);label.frame=CGRectMake(10, 30,frame.size.width, frame.size.height);label.text = str;[self.view addSubview:label];

4. label文字顶部对齐

参考唐巧的博客
当此文中的方法三已经不适用。
下面给出方法三新的解决办法,给Label增加一个类别的方法

@implementation UILabel (VerticalAlign)-(void)alignTop{CGSize fontSize =[self.text sizeWithAttributes:@{NSFontAttributeName:self.font}];CGRect frame =[self.text boundingRectWithSize:CGSizeMake(self.frame.size.width, self.frame.size.height) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.font} context:nil];int newLinesToPad=(self.frame.size.height - frame.size.height)/fontSize.height;for (int i = 0; i<newLinesToPad; i++) {    self.text=[self.text stringByAppendingString:@"\n "];//\n后必须要有空格,否则xcode会把这个\n后的所有\n都忽略}}- (void)alignBottom {CGSize fontSize =[self.text sizeWithAttributes:@{NSFontAttributeName:self.font}]; CGRect frame =[self.text boundingRectWithSize:CGSizeMake(self.frame.size.width, self.frame.size.height) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.font} context:nil];int newLinesToPad = (self.frame.size.height  - frame.size.height) / fontSize.height;for(int i=0; i<newLinesToPad; i++)    self.text = [NSString stringWithFormat:@" \n%@",self.text];//\n后必须要有空格,否则xcode会把这个\n后的所有\n都忽略}@end

运行效果:
向下对齐
向顶部对齐

0 0
原创粉丝点击