【问题标题】:Issue while using `boundingRectWithSize` for aligning UILabels in dynamic frames使用 `boundingRectWithSize` 在动态框架中对齐 UILabel 时出现问题
【发布时间】:2014-07-16 11:18:43
【问题描述】:

我有两个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 中没有空格时,它可以正常工作。

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

输出如下所示,

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

输出如下所示,

为什么空格文本会影响我的代码?我应该对我的代码进行哪些更改才能在上述条件下正常工作?

【问题讨论】:

  • 嗯...L1.text = s;L1.text = @"2"?我没听懂。
  • @Neeku, s 是 NSString。
  • 是的,我的意思是你为什么在s之后分配@"2"?它不会取代它而不是合并吗? /我很困惑!
  • @Neeku,已编辑,它是 L2.text。谢谢
  • 啊。行。编辑帮助。那是L2。 (:

标签: ios objective-c ios7 nsstring uilabel


【解决方案1】:

找到解决方案!

我只是在一个临时字符串中将空格替换为 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);

【讨论】:

  • "x" 对我没有用,但是“l”做到了。还没有找到更好的解决方案,因为您的方法似乎依赖于字体。无论如何,我要 +1。
【解决方案2】:

这些标签是在故事板/XIB 中创建的吗?那么你或许应该关闭 AutoLayout。

另外,numberOfLines 为 0 表示行数无限。这意味着自动换行,但是由于标签的高度限制,不会显示。换行解释了字符串长度不同的现象:如果second字过长,则会换行并显示...,表示没有显示所有文本。

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

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

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

顺便说一句,变量名不应该大写和人类可读。所以label1 虽然仍然不理想,但比L1 更可取。

【讨论】:

  • 感谢回复,正如您提到的,minimumScaleFactor、adjustsFontSizeToFitWidth 和 numberOfLines 会影响结果的三件事。我删除了它们,问题仍然存在。我正在使用 XIB 来创建这些标签。如何解决这个问题?
猜你喜欢
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 2021-02-19
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
相关资源
最近更新 更多