【问题标题】:How can I prevent sizeToFit from changing the UILabel width?如何防止 sizeToFit 更改 UILabel 宽度?
【发布时间】:2013-11-06 15:21:36
【问题描述】:

我现在有一个 UILabel,并且 UILabel.text 的值会定期变化。

我遇到的问题是,如果每次 UILabel.text 值发生变化,UILabel 的宽度会根据标签的内容而变化。

我该如何解决这个问题?这是我现在拥有的代码:

outputLabel.text = errorMessage;
outputLabel.hidden = NO;
[outputLabel sizeToFit];

更新 我使用 sizeToFit 的原因是因为我需要自动改变高度。

谢谢,

彼得

【问题讨论】:

  • 如果您不想调整标签大小,请不要致电sizeToFit。该方法的重点是调整标签的大小以适合其包含的文本。
  • 但是我想改变高度。
  • 然后根据固定宽度计算新文本的大小。然后设置标签的框架以匹配计算的高度和给定的宽度。
  • 我不完全确定该怎么做
  • NSString(在UIKit 类别中)有多种方法可以执行计算。搜索一下如何确定字符串的大小。

标签: ios objective-c width uilabel


【解决方案1】:

使用以下技巧完成工作:

首先是uiLabel的set标签。我的 cell.yourLable 标签是 998

cell.yourLable.numberOfLines = 0;
[cell.yourLable sizeToFit];

UILabel *myLbl=[cell.contentView viewWithTag:998];
CGRect frm=cell.yourLable.frame;
frm.size.width = cell.contentView.frame.size.width;
myLbl.frame=frm;

这里的诀窍是通过标签获取相同的 UiLabel 并通过设置框架设置其宽度。

【讨论】:

    【解决方案2】:

    我继承了 UILabel 并覆盖了 sizeThatFits 方法,看起来像这样:

    - (CGSize)sizeThatFits:(CGSize)size
    {
        CGSize res = [super sizeThatFits:size];
    
        return CGSizeMake(size.width, res.height);
    }
    

    然后,如果我将标签添加到笔尖,我会从对象库中放置一个 UILabel。之后,我确保将放置标签的类设置为我的自定义类,而不是默认的 UILabel。

    它基本上只是用原始宽度覆盖新宽度,因此它永远不会改变宽度,而是动态改变高度。

    【讨论】:

      【解决方案3】:

      [UILabel sizeThatFits:] 与具有无限高度的CGSize 一起使用,例如(320, 10000)

      【讨论】:

      • 该方法返回一个CGSize(它不会改变UILabel),您需要从该CGSize中提取高度并将其分配给UILabel
      • 上次我检查了 10000 不是无限的。 ;) 使用HUGE_VALF
      • @chaiguy thx,只是懒得检查实际的 const 名称是什么 :) 无论如何,如果一个人有 10000 像素的高度视图,他应该更担心其他事情。
      • 处理 CGFloat 值时,始终使用 CGFLOAT_MAX 或 CGFLOAT_MIN。不要依赖他们总是双打。
      【解决方案4】:

      您可以创建一个类别或 UILabel 的子类,并添加此方法以根据输入文本仅调整标签的高度

      - (void)heightToFit {
      
          CGSize maxSize = CGSizeMake(self.frame.size.width, CGFLOAT_MAX);
          CGSize textSize = [self.text sizeWithFont:self.font constrainedToSize:maxSize lineBreakMode:self.lineBreakMode];
      
          CGRect labelRect = self.frame;
          labelRect.size.height = textSize.height;
          [self setFrame:labelRect];
      }
      

      并使用它来代替 sizeToFit

      【讨论】:

      • 这听起来很愚蠢。我将如何创建 UILabel 的子类,我看到人们谈论这个,但我从来没有发现如何做到这一点
      • 自 iOS7 以来已弃用,现在要使用的新方法是 'sizeWithAttributes:' 因此您需要在 rutime 实现以使用 iOS6 和之前的方法或 iOS7 方法。使用调整标签大小的方法创建子类或类别的另一个好理由
      • 我不是为 iOS 6 开发应用程序
      • 所以你只需要用新方法替换不推荐使用的方法
      • @Manu - 仅供参考 - 如果您有一个部署目标为 iOS 6 或更早版本的应用程序以及 iOS 7 的 Base SDK,您可以安全地将sizeWithFont... 与 iOS 7 或更早版本一起使用。不推荐使用的方法可以毫无问题地使用(除了可能的警告)。如果你只支持 iOS 7,那么你应该使用新的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 2010-10-21
      • 1970-01-01
      • 2016-09-13
      相关资源
      最近更新 更多