使用`boundingRectWithSize`在动态帧中对齐UILabel时出现问题

时间:2014-07-16 11:18:43

标签: ios objective-c ios7 nsstring uilabel

我有两个UILabels L1和L2。

  • L1的最大宽度为150
  • L1的最小宽度将根据文字长度
  • 进行调整
  • 两个标签之间的距离为10。

我的代码,

NSString *s = @"Stringwithoutspacetext";
L1.text = s;
L2.text = @"2";


CGSize  textSize = { 150, 21 };
CGRect textRect = [[NSString stringWithFormat:@"%@",s]
        boundingRectWithSize:textSize
        options:NSStringDrawingUsesLineFragmentOrigin
        attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:17]}
        context:nil];

L1.frame = CGRectMake(L1.frame.origin.x, L1.frame.origin.y, textRect.size.width, L1.frame.size.height);
L2.frame = CGRectMake(L1.frame.origin.x+textRect.size.width+10, L2.frame.origin.y, L2.frame.size.width, L2.frame.size.height);

当字符串s中没有空格时,它可以正常工作。

enter image description here

如果字符串有一个空格,即。 s = @"String withspacetext";

输出如下所示,

enter image description here

如果字符串有两个空格,即。 s = @"String with spacetext";

输出如下所示,

enter image description here

为什么空格文字会影响我的代码?在上述条件下,我应该如何更改代码才能正常工作?

2 个答案:

答案 0 :(得分:2)

找到解决方案!

我只是用临时字符串中的x替换空格来查找textrect的大小。

NSString *s = @"String with spacetext";
L1.text = s;
L2.text = @"2";

NSString *tempstring =[s stringByReplacingOccurrencesOfString:@" " withString:@"x"];
CGSize  textSize = { 150, 21 };
CGRect textRect = [[NSString stringWithFormat:@"%@",tempstring]
        boundingRectWithSize:textSize
        options:NSStringDrawingUsesLineFragmentOrigin
        attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:17]}
        context:nil];

L1.frame = CGRectMake(L1.frame.origin.x, L1.frame.origin.y, textRect.size.width, L1.frame.size.height);
L2.frame = CGRectMake(L1.frame.origin.x+textRect.size.width+10, L2.frame.origin.y, L2.frame.size.width, L2.frame.size.height);

答案 1 :(得分:0)

这些标签是否在storyboard / XIB中创建?然后你应该关掉AutoLayout。

此外,numberOfLines为0表示无限数行。这意味着自动换行,但由于标签的高度受限,未显示。自动换行使用不同长度的字符串解释现象:如果第二字太长,它将断开该行并显示...以指示并非显示所有文本。

此外,adjustsFontSizeToWidth并不总是有效,特别是如果标签的宽度不固定,这就是这种情况。

此外,最好根据字体计算textSize,而不是硬编码。

此外,将字符串格式化为字符串的stringWithFormat是多余的。

BTW,变量名不应大写且易读。因此label1虽然仍不理想,但优于L1