【问题标题】:iOS resize styled UILabel dynamicallyiOS 动态调整样式的 UILabel
【发布时间】:2013-04-08 05:55:24
【问题描述】:

我通过情节提要在我的滚动视图底部添加了一个具有固定高度和初始高度的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。 结果很奇怪,文本在标签中垂直对齐放置,像这样:

(我无法显示标签的整个高度,因为滚动视图会将其截断)

如果我在sizeToFit 之后NSLog UILabel 的高度,我正确地看到标签的高度是 105 像素,但标签肯定不会以该高度显示。

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


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

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

标签的属性有:

换行:自动换行
自动收缩:最小字体大小 (10)
收紧字母间距已关闭,Autoresize subviews 已打开。

保存UILabel 的容器是UIScrollView。我在调用sizeToFit之后自动调整滚动视图的高度。

scrollview的视图模式设置为Scale to Fill并且Autoresize subviews开启。

【问题讨论】:

  • 在哪里您将调用 sizeToFit 的代码放置在哪里,以及为标签和保存标签的容器(滚动视图、看起来像)?
  • @Nate 我已将您请求的信息添加到我的问题底部。如果您需要更多信息,请告诉我。
  • 第二张截图是在sizeToFit调用之后截的吗?
  • @mja 是的,当情节提要中的高度设置为 250 时,屏幕截图是在 sizeToFit 之后拍摄的。

标签: iphone ios xcode uilabel


【解决方案1】:

这里可能有一些问题。

  • 首先,当你这样说时:

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

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

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

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

adjustsFontSizeToFitWidth

重要提示:如果此属性设置为 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);
   });
}

结果

【讨论】:

  • 谢谢您的出色回答。在加载屏幕的其余部分后以编程方式绘制标签确实解决了我的问题。
  • 好消息。很高兴我能帮上忙。
【解决方案2】:
  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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-23
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多