2

UILabel我已经通过情节提要在我的滚动视图底部添加了一个固定的初始高度。通过UIViewContoller我给了UILabel一个白色的背景和圆角,并动态地将文本加载到标签中。

我想要做的是根据文本调整标签高度。我已经阅读了大量关于如何执行此操作的 stackoverflow 帖子,并尝试了所有这些帖子,但似乎没有一个有效。

为了解决这个问题,我使用以下代码:

descriptionLabel.numberOfLines = 0;
descriptionLabel.text = @"Nam nisi arcu, sodales vitae scelerisque sit amet. Nam nisi arcu, sodales vitae scelerisque sit amet. Nam nisi arcu, sodales vitae scelerisque sit amet.";
[descriptionLabel sizeToFit];

这样做的结果是标签将像这样剪切文本: 在此处输入图像描述

我想到的是 sizeToFit 使用 UILabel 的初始高度来确定最大高度,所以在情节提要中我将其更改为 250。结果很奇怪,文本在标签中垂直对齐,如下所示:

在此处输入图像描述

(我无法显示标签的整个高度,因为 scrollView 将其切断)

如果我是afterNSLog的高度,我可以正确地看到标签的高度是 105 像素,但标签绝对没有以该高度显示。UILabelsizeToFit

我非常感谢一些帮助,因为这个问题现在让我忙了一个星期。


更新:根据要求提供一些附加信息。

UILabel在通过 RESTkit 从服务器接收到一些 JSON 后调用调整大小的代码。viewDidLoad执行通过 加载数据的函数dispatch_async()

标签的属性是:

换行:自动换
行 Autoshrink:最小字体大小 (10)
关闭字母间距并打开Autoresize 子视图

容纳 的容器UILabelUIScrollView. 我在调用自动调整滚动视图的高度sizeToFit

滚动视图的视图模式设置为Scale to Fill并打开Autoresize subviews

4

2 回答 2

5

这里可能存在一些问题。

  • 首先,当你这样说时:

我在调用 sizeToFit 后自动调整滚动视图的高度。滚动视图的视图模式设置为 Scall to Fill 并打开 Autoresize subviews。

这可能是个问题。呼叫sizeToFit正在尝试调整您的标签大小。但是,如果您稍后调整滚动视图的大小,并且您的滚动视图设置为Autoresize Subviews,那么它可能会再次调整标签的大小。 sizeToFit应该是您在标签上进行的最后一次调整大小。

  • 此外,当您说“自动调整滚动视图的高度”时,我不是 100% 确定您的意思。我认为您应该做的是在获得 JSON 响应后,确定所有标签的大小,然后设置滚动视图的内容大小。滚动视图的frame大小(高度)不应改变。

  • 如果您阅读UILabel 文档,它会说:

调整FontSizeToFitWidth

重要提示:如果此属性设置为 YES,则将 lineBreakMode 属性设置为导致文本换行到另一行的值是程序员错误。

因此,如果标签也设置为自动换行,您可能不应该设置该属性 ( Autoshrink )。

解决方案

无论如何,我知道您正在使用情节提要,但希望下面的代码示例可以向您展示它应该如何工作:

- (void)viewDidLoad
{
   [super viewDidLoad];
   // Do any additional setup after loading the view from its nib.
   self.scrollView.autoresizesSubviews = YES;
   self.scrollView.contentMode = UIViewContentModeScaleToFill;

   // simulate a network delay of 4 seconds to fetch JSON
   double delayInSeconds = 4.0;
   dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
   dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
      // we have the "JSON" data
      int dfltLabelHeight = 250;  // will be resized!
      int yPadding = 10;
      int y = yPadding;
      int numLabels = 8;

      for (int i = 0; i < numLabels; i++) {
         UILabel* label = [[UILabel alloc] initWithFrame: CGRectMake(0, y,
                                                                     self.scrollView.frame.size.width, dfltLabelHeight)];
         label.lineBreakMode = NSLineBreakByWordWrapping;
         label.minimumFontSize = 10;
         label.autoresizesSubviews = YES;  // doesn't matter here
         //label.adjustsFontSizeToFitWidth = YES;
         //label.adjustsLetterSpacingToFitWidth = NO;  // this crashes on iOS 6.1
         label.numberOfLines = 0;
         label.text = @"Nam nisi arcu, sodales vitae scelerisque sit amet. Nam nisi arcu, sodales vitae scelerisque sit amet. Nam nisi arcu, sodales vitae scelerisque sit amet.";
         [self.scrollView addSubview: label];
         [label sizeToFit];

         // re-center the label horizontally
         CGRect frame = label.frame;
         frame.origin.x = (self.scrollView.frame.size.width - frame.size.width) / 2;
         label.frame = frame;

         y += yPadding + label.frame.size.height;
      }

      // adjust scroll view's virtual (content) size to fit the labels
      self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width, y);
   });
}

结果

在此处输入图像描述

于 2013-04-07T21:40:35.363 回答
0
  UIFont *myFont = [UIFont systemFontOfSize:12];
  NSString *myText= @"Nam nisi arcu, sodales vitae scelerisque sit amet. Nam nisi arcu, sodales vitae scelerisque sit amet. Nam nisi arcu, sodales vitae scelerisque sit amet.";
  CGSize textSize = [myText sizeWithFont: myFont constrainedToSize:CGSizeMake(280, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap];
  descriptionLabel.frame = CGRectMake(20, 200, 280, textSize.height);
  descriptionLabel.text = myText;
于 2013-04-07T16:42:05.203 回答