iOS动态调整样式UILabel

时间:2013-04-07 10:07:34

标签: iphone ios xcode uilabel

我已经通过故事板在我的滚动视图底部添加了一个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];

这样做的结果就是标签会像这样剪切文字: enter image description here

我想到的是sizeToFit使用UILabel的初始高度来确定最大高度,因此在故事板中我将其更改为250。 结果非常奇怪,文本垂直对齐在标签中,如下所示:

enter image description here

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

如果我NSLog UILabel sizeToFit之后的UILabel的高度,我会正确地看到标签的高度是105像素,但标签绝对没有显示高度

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


更新:根据要求提供一些其他信息。

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

标签的属性是:

换行符:自动换行
自动收缩:最小字体大小(10)
收紧字母间距已关闭,自动调整次级视图已开启。

包含UIScrollView的容器是sizeToFit。我在调用{{1}}之后自动调整了scrollview 的高度。

滚动视图的查看模式设置为缩放至填充,并且自动调整子视图已启用。

2 个答案:

答案 0 :(得分:5)

这里可能存在一些问题。

  • 首先,当你这样说:
  

在调用sizeToFit后,我自动调整了scrollview的高度。该   scrollview的视图模式设置为Scall to Fill和Autoresize   子视图已打开。

这可能是个问题。致电sizeToFit正在尝试调整标签大小。但是,如果您稍后调整滚动视图的大小,您的滚动视图设置为自动调整子视图,则可能会再次调整标签大小。 sizeToFit应该是您在标签上调整的 last

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

  • 如果您阅读the UILabel documentation,则会说:

  

<强> adjustsFontSizeToFitWidth

     

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

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

解决方案

无论如何,我知道你正在使用故事板,但希望下面的代码示例可以告诉你这应该如何工作:

- (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);
   });
}

结果

enter image description here

答案 1 :(得分: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;