【问题标题】:Dynamically resize label in iOS 7在 iOS 7 中动态调整标签大小
【发布时间】:2013-09-26 13:00:10
【问题描述】:

在 iOS 6 中,我使用的是:

CGSize labelSize = [self.text sizeWithFont:self.font constrainedToSize:size lineBreakMode:self.lineBreakMode];
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y , labelSize.width, self.frame.size.height);

动态调整 UILabel 的大小。这在 iOS 7 中不起作用,所以我尝试了:

NSString *text = self.text;
CGFloat width = size.width;
UIFont *font = self.font;
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text
                                                                 attributes:@{ NSFontAttributeName: font }];

CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
                              options:NSStringDrawingUsesDeviceMetrics
                              context:nil];
CGSize size = rect.size;

self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y , size.width, self.frame.size.height);

这是在 UILabel 上的一个类别中,但这也不起作用... 任何想法我应该使用什么?

【问题讨论】:

  • 哪一部分不工作?是计算的帧大小错误,还是标签大小没有发生变化?

标签: objective-c uilabel ios7


【解决方案1】:

尝试这样的事情(在没有自动布局的情况下工作):

NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                                           [UIFont fontWithName:@"FontName" size:15], NSFontAttributeName,
                                                            nil];

CGRect frame = [label.text boundingRectWithSize:CGSizeMake(263, 2000.0)
                                                     options:NSStringDrawingUsesLineFragmentOrigin
                                                  attributes:attributesDictionary
                                                     context:nil];

CGSize size = frame.size;

【讨论】:

    【解决方案2】:

    如果没有更多关于它为什么不起作用的详细信息,我的猜测是您需要使用选项 NSStringDrawingUsesLineFragmentOrigin 才能使其成为旧 sizeWithFont: 的直接替代品,如下所示:

    NSString *text = ...;
    CGFloat width = ...;
    UIFont *font = ...;
    NSAttributedString *attributedText =
        [[NSAttributedString alloc]
            initWithString:text
            attributes:@
            {
                NSFontAttributeName: font
            }];
    CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    CGSize size = rect.size;
    

    请注意文档中提到的:

    在 iOS 7 及更高版本中,此方法返回小数大小(在大小 返回的 CGRect 的组成部分);使用返回的大小来调整大小 视图,您必须使用将其值提高到最接近的更高整数 使用 ceil 函数。

    所以要提取用于调整视图大小的计算高度或宽度,我会使用:

    CGFloat height = ceilf(size.height);
    CGFloat width  = ceilf(size.width);
    

    【讨论】:

    • @user426132 帮助我了解什么不起作用。哪一部分的行为不像 sizeWithFont: 过去那样?
    【解决方案3】:
    - (void)resizeLabelByContent:(UILabel *)label
    {
    
        CGSize maxSize = CGSizeMake(label.width, 999);
    
        NSString *contentStr = label.text;
    
        UIFont *contentFont = label.font;
    
        CGRect contentFrame;
    
        NSString *version = [[UIDevice currentDevice] systemVersion];
    
        if ([version floatValue] < 7.0) {
    
            CGSize contentStringSize = [contentStr sizeWithFont:contentFont constrainedToSize:maxSize lineBreakMode:label.lineBreakMode];
    
            contentFrame = CGRectMake(label.left, label.top, label.width, contentStringSize.height);
    
        } else {
    
            NSDictionary *contentDic = [NSDictionary dictionaryWithObjectsAndKeys:contentFont, NSFontAttributeName, nil];
    
            CGSize contentStrSize = [contentStr boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:contentDic context:nil].size;
    
            contentFrame = CGRectMake(label.left, label.top, label.width, contentStrSize.height);
        }
    
        label.frame = contentFrame;
    }
    

    【讨论】:

      【解决方案4】:

      这应该可以在 iOS6 和 iOS7 中使用,但会破坏您的标签约束(如果需要,您需要以编程方式将它们全部重新设置):

      -(void)resizeHeightForLabel: (UILabel*)label {
          label.numberOfLines = 0;
          UIView *superview = label.superview;
          [label removeFromSuperview];
          [label removeConstraints:label.constraints];
          CGRect labelFrame = label.frame;
          if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
              CGRect expectedFrame = [label.text boundingRectWithSize:CGSizeMake(label.frame.size.width, 9999)
                                                              options:NSStringDrawingUsesLineFragmentOrigin
                                                           attributes:[NSDictionary dictionaryWithObjectsAndKeys:
                                                                       label.font, NSFontAttributeName,
                                                                       nil]
                                                              context:nil];
              labelFrame.size = expectedFrame.size;
              labelFrame.size.height = ceil(labelFrame.size.height); //iOS7 is not rounding up to the nearest whole number
          } else {
      #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
              labelFrame.size = [label.text sizeWithFont:label.font
                                       constrainedToSize:CGSizeMake(label.frame.size.width, 9999)
                                           lineBreakMode:label.lineBreakMode];
      #pragma GCC diagnostic warning "-Wdeprecated-declarations"
          }
          label.frame = labelFrame;
          [superview addSubview:label];
      }
      

      将此方法添加到您的 viewController 并像这样使用它:

      [self resizeHeightForLabel:myLabel];
      //set new constraints here if needed
      

      【讨论】:

      • 我需要调整宽度而不是高度......我会试一试...... thx
      • 试试看,我觉得修改代码调整宽度也不是那么难。
      • 确保在调用此方法之前添加标签以查看(使用 IB 或以编程方式)。如果您使用自动布局和约束,请尝试在应用此功能之前和之后注销标签框宽度/高度(如果它已更改)。如果框架发生了变化,那么您必须调整约束。如果没有,那么在其他地方有一些错误。尝试使用NSLog (@"width:%f, height:%f", myLabel.frame.size.width, mylabel.frame.size.height); 之类的方法来记录宽度/高度。
      猜你喜欢
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      • 2014-03-01
      • 2015-08-04
      相关资源
      最近更新 更多