【问题标题】:Dynamically resizing a UILabel, but its not working.动态调整 UILabel 的大小,但它不起作用。
【发布时间】:2014-02-02 16:34:24
【问题描述】:

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

        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 文件的快照。

【问题讨论】:

    标签: ios iphone ios5 ios4 ios6


    【解决方案1】:

    我在您的代码中没有发现任何逻辑问题。您可能需要检查两件事:

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

    【讨论】:

    • 它实际上是由我验证的,因为我说我通过调试点验证了它。
    【解决方案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]
    

    希望这会有所帮助!

    【讨论】:

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

    更新:不要使用locFeedcell.lbl_location.bounds.origin.x+width,而是使用locFeedcell.lbl_location.frame.origin.x+widthbounds.origin.x 始终是 0

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

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

    【讨论】:

    • 是的,自动布局已启用,不知道这一点。谢谢,这是一个巨大的帮助。谢谢你的小费。
    【解决方案4】:

    //用于自定义字体

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

    //系统字体使用这个

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

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

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

    //height -> 你的标签高度;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多