动态调整 UILabel 的大小,但它不起作用。

Dynamically resizing a UILabel, but its not working.

提问人: 提问时间:1/14/2014 更新时间:1/15/2014 访问量:655

问:

我正在尝试根据其中的文本(或我允许的最大宽度,即 108)调整标签大小,并在其旁边放置一个按钮,下面的代码实际上在调试时给出了令人满意的结果,但标签的宽度没有相应地改变。 在xib中是否有任何特殊设置或其他任何事情,请帮助Iam

        NSDictionary *attrib=@{NSFontAttributeName:locFeedcell.lbl_location.font};
        CGFloat width=[locFeedcell.lbl_location.text sizeWithAttributes:attrib].width;
        CGRect newLabelframe=locFeedcell.lbl_location.frame;
        CGRect newButtonFrame=locFeedcell.btn_map.frame;
        if (width>=108.00f) {
            newLabelframe.size.width=108.00;
        } else {
            newLabelframe.size.width=width;
            newButtonFrame.origin.x=locFeedcell.lbl_location.bounds.origin.x+width+4.00;
        }
        locFeedcell.lbl_location.frame=newLabelframe;
        locFeedcell.btn_map.frame=newButtonFrame; 

这是XIB文件的快照。

here is snapshot of xib file.

iPhone的iOS5 iOS4的iOS6

评论


答:

0赞 Hail Zhang 1/14/2014 #1

我在您的代码中没有看到任何逻辑问题。您可以检查两件事:

  1. 将最大宽度更改为两倍或更宽,以使更改明显,以便于验证;
  2. 在将新框架设置为 UI 元素时,请确保您处于 UI 线程中。

评论

0赞 1/15/2014
正如我所说,它实际上是由我验证的,我通过调试点验证了它。
0赞 adepablor 1/15/2014 #2

使用自动布局约束怎么样?

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/AutolayoutPG/Introduction/Introduction.html

您有 3 个对象:

  1. 最近在 --> 让我们称之为 lbl_recentlyAt
  2. lbl_location
  3. btn_map

您将需要 3 个约束:

  1. 设置最近添加标签的固定位置:

|-X-[lbl_recentlyAt]

  1. 设置位置标签和按钮的可变位置,假设使用 20p 空间

[lbl_recentlyAt]-20-[lbl_location]-20-[btn_map]

当lbl_location宽度更改时,您可能需要调用单元格的 setNeedsLayout 方法来更新布局: https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html#//apple_ref/occ/instm/UIView/setNeedsLayout

[cellView setNeedsLayout]

希望这有帮助!

评论

0赞 1/15/2014
自动布局确实有帮助,但我试图以简单的方式做到这一点......使用 Auto Layot 对我来说是一件复杂的事情......但你@adepablor知识共享。它可能会在将来的某个地方帮助我。
0赞 adepablor 1/16/2014
不客气,使用任何您认为更容易的方法。但我的建议是,现在或在可预见的将来,仔细阅读我发布的自动布局链接。它不会花费你超过一个小时,你会发现它并没有那么复杂!此外,您可以在故事板中添加约束,这意味着更少的代码,这意味着更少的错误,这很棒!:)
0赞 florianbuerger 1/15/2014 #3

更新:而不是使用 use . 总是 .locFeedcell.lbl_location.bounds.origin.x+widthlocFeedcell.lbl_location.frame.origin.x+widthbounds.origin.x0

也许您的文件中启用了自动布局?检查实用程序窗格中的文件检查器选项卡。 如果这没有帮助,您可以在设置框架之前和之后发布它们的值吗?记住标签和按钮的内存地址,并在所有布局完成后再次打印它们的框架。.xib

快速提示: 您可以使用 instead 而不是从框架中获取正确的边缘。CGRectGetMaxX(locFeedcell.lbl_location.frame)locFeedcell.lbl_location.bounds.origin.x+width

评论

0赞 1/15/2014
是的,自动布局已启用,但不知道。谢谢,这是一个巨大的帮助。也感谢小费。
0赞 Om Prakash 1/15/2014 #4

将其用于自定义字体

CGFloat width = [label.text sizeWithFont:[UIFont fontWithName:@“ChaparralPro-Bold” size:40 ]].width;

将其用于系统字体

CGFloat 宽度 = [label.text sizeWithFont:[UIFont systemFontOfSize:40 ]].width;

label.frame = CGRectMake(point.x, point.y, width,height);

point.x, point.y -> 标签的原点;

height ->标签高度;