【问题标题】:iOS - Change UILabel font size proportionallyiOS - 按比例更改 UILabel 字体大小
【发布时间】:2014-06-02 12:52:44
【问题描述】:

在我看来,我有几个UILables,如下所示:

那些红色的永远不应该改变他们的字体大小。另外两个白色(50 和 50)应按比例减小其字体大小以适应内容。 我想要实现的是,当任何一个白色标签变成两个大时,另一个也应该开始减小尺寸:

但是我得到了这个:

如何使我的 UILabel 的字体大小按比例调整?

【问题讨论】:

  • //获取Label字体大小 CGFloat fontSize = self.label.font.pointSize;将此字体大小用于第二个标签

标签: ios xcode cocoa-touch autolayout


【解决方案1】:

最简单的方法如下:

  1. 确定标签 1 和标签 2 的最大可能宽度。
  2. 总结两个标签的宽度。
  3. 在两个标签中附加您要设置的两个字符串。
  4. 获取适合组合宽度中给定(组合)文本的字体大小。
  5. 现在计算上述确定字体大小的第一个文本的宽度并将其分配给第一个标签。
  6. 根据其框架调整标签框架的其余部分。
  7. 类似标识第二个标签的宽度。
  8. 将上述派生字体大小分配给两个标签。

【讨论】:

    【解决方案2】:

    一种简单的方法是使用UILabel'ssizeToFit 方法手动调整字体大小来计算其边界。

    int fontSize = MAX_FONTSIZE;
    BOOL fontSizeNeedsToBeAdjusted = NO;
    CGRect originalLabelFrame1 = label1.frame;
    CGRect originalLabelFrame2 = label2.frame;
    
    while(fontSizeNeedsToBeAdjusted && fontSize>MIN_FONTSIZE){
        label1.frame = originalLabelFrame1;
        label1.font = [UIFont systemFontOfSize:fontSize];
        [label1 sizeToFit];
    
        label2.frame = originalLabelFrame2;
        label2.font = [UIFont systemFontOfSize:fontSize];
        [label2 sizeToFit];
    
        if(CGRectGetWidth(label1.frame)>CGRectGetWidth(originalLaeblFrame1) || CGRectGetHeight(label1.frame)>CGRectGetHeight(originalLaeblFrame1)) 
        || CGRectGetWidth(label2.frame)>CGRectGetWidth(originalLaeblFrame2) || CGRectGetHeight(label2.frame)>CGRectGetHeight(originalLaeblFrame2)){
        fontSizeNeedsToBeAdjusted = YES;
        fontSize--;
    }else
        fontSizeNeedsToBeAdjusted = NO;
    }
    

    更快的方法是使用NSString's boundingRectWithSize: options:attributes:context: 方法计算大小:

    NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontofSize:fontSize]};
    // NSString class method: boundingRectWithSize:options:attributes:context is
    // available only on ios7.0 sdk.
    CGRect bounds = [label1.text boundingRectWithSize:CGSizeMake(CGRectGetWidth(label1.frame), MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:attributes
                                              context:nil];
    

    【讨论】:

      【解决方案3】:

      我希望这个问题的答案在 NSMutableAttributedString 中,所以我做了一个小实验

      NSString *quantity = @"123456";
      
      NSString *metrics =@"m2";
      
      NSString *quantity2 = @"50";
      
      NSString *metrics2 =@"pk";
      
      NSString *separator = @" / ";
      
      
      NSMutableAttributedString *fullString = [[NSMutableAttributedString alloc] initWithString: 
          [NSString stringWithFormat:@"%@%@%@%@%@",quantity,metrics,separator,quantity2,metrics2]];
      
      [fullString addAttribute:NSFontAttributeName
                         value:[UIFont systemFontOfSize:25.0]
                         range:NSMakeRange(quantity.length+metrics.length, separator.length)];
      
      [fullString addAttribute:NSFontAttributeName
                  value:[UIFont systemFontOfSize:12.0]
                  range:NSMakeRange(fullString.length-metrics.length, metrics.length)];
      
      
      _lblTitle.attributedText =  fullString;
      

      所以尝试更改值并添加属性,你会得到你想要的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-18
        • 2023-01-22
        • 2015-04-04
        • 1970-01-01
        • 1970-01-01
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多