【问题标题】:How to fix the uilabel height as dynamic[depend upon text]?如何将 uilabel 高度固定为动态[取决于文本]?
【发布时间】:2023-03-25 14:10:01
【问题描述】:

我正在尝试将标签高度固定为动态以取决于文本。

CGSize size = [Str sizeWithAttributes:
                       @{NSFontAttributeName: [UIFont fontWithName:@"OpenSans" size:15]}];
        CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));
        NSLog(@"this is height of the label =%@",NSStringFromCGSize(adjustedSize));

这里我得到了宽度和高度,但是宽度超过了屏幕尺寸宽度。

我想要的是标签宽度应该等于我的屏幕尺寸,高度取决于文本............

【问题讨论】:

  • 查看我对这个问题的回答:stackoverflow.com/questions/34009311/…
  • 好的兄弟........ @WojtekDmyszewicz
  • @WojtekDmyszewicz 我已经通过编程方式创建了我的 uilabel
  • 在我的示例中,我使用约束来解决您的问题,可以通过编程方式添加相同的约束。

标签: ios objective-c uilabel


【解决方案1】:

设置

yourLabel.numberOfLines = 0;
[yourLabel sizeToFit];

为该标签指定一个特定的宽度或前导和尾随空格,以便宽度保持固定,而高度随着文本长度的增加而增加。

您也可以通过您的 xib 文件设置 NumberOfLines。 1.在xib中点击你的标签。 2.在对齐选项卡下方的右侧面板中,您可以将numberOfLines设置为1到0。

【讨论】:

  • 我已经以编程方式完成了,所以我很困惑以编程方式设置约束
  • 即使您以编程方式创建标签,您仍然可以为标签添加宽度并设置 numberOfLines = 0。
  • NSLayoutConstraint *leadingConstraint= [NSLayoutConstraint constraintWithItem:self.contentView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:_yourLabel attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0]; NSLayoutConstraint *topConstraint= [NSLayoutConstraint constraintWithItem:self.contentView 属性:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:_yourLabel 属性:NSLayoutAttributeTop 乘数:1.0 常数:0]; [self.contentView addConstraints:@[leadingConstraint,topConstraint]];尝试使用它并以您的方式操作它。
【解决方案2】:

您可以使用以下代码将标签高度固定为动态以依赖于文本

NSString *str = [NSString stringWithFormat:@"Lorem Ipsum 只是印刷和排版行业的虚拟文本。自 1500 年代以来,Lorem Ipsum 一直是该行业的标准虚拟文本,当时一位未知的打印机采用了一种类型的厨房和争先恐后地做成了活字标本本。"];

CGSize maximumLabelSize = CGSizeMake(self.view.frame.size.width - 20, FLT_MAX);

CGSize expectedLabelSize = [str sizeWithFont:[UIFont fontWithName:@"OpenSans" size:15] constrainedToSize:maximumLabelSize lineBreakMode:NSLineBreakByWordWrapping];


UILabel *Label = [[UILabel alloc] init];
[Label setTranslatesAutoresizingMaskIntoConstraints:NO];
//set new frame to label.
CGRect newFrame = Label.frame;
newFrame.origin.x = 10;
newFrame.origin.y = 20;
newFrame.size.width = expectedLabelSize.width - 20;
newFrame.size.height = expectedLabelSize.height;
Label.frame = newFrame;
Label.text = str;
Label.lineBreakMode = NSLineBreakByWordWrapping;
Label.numberOfLines = 20;
Label.font = [UIFont fontWithName:@"OpenSans" size:15];
Label.backgroundColor = [UIColor redColor];

[self.view addSubview:Label];

//width constraint
[Label addConstraint:[NSLayoutConstraint constraintWithItem:Label
                                                  attribute:NSLayoutAttributeWidth
                                                  relatedBy:NSLayoutRelationEqual
                                                     toItem:nil
                                                  attribute: NSLayoutAttributeNotAnAttribute
                                                 multiplier:1
                                                   constant:expectedLabelSize.width - 20]];

//height constraint
[Label addConstraint:[NSLayoutConstraint constraintWithItem:Label
                                                  attribute:NSLayoutAttributeHeight
                                                  relatedBy:NSLayoutRelationEqual
                                                     toItem:nil
                                                  attribute: NSLayoutAttributeNotAnAttribute
                                                 multiplier:1
                                                   constant: expectedLabelSize.height]];

//center constraint
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.view
                                                       attribute:NSLayoutAttributeCenterX
                                                       relatedBy:NSLayoutRelationEqual
                                                          toItem:Label
                                                       attribute: NSLayoutAttributeCenterX
                                                      multiplier:1
                                                        constant:0]];
// Top constraint
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:Label
                                                      attribute:NSLayoutAttributeTop
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:self.topLayoutGuide
                                                      attribute: NSLayoutAttributeBottom
                                                     multiplier:1
                                                       constant:20]];

【讨论】:

  • 如果动态标签仍有问题,您需要检查您的自定义字体(OpenSans)是否可用。您可以使用以下方法检查您的应用程序上的可用字体。
  • static void dumpAllFonts() { NSLog(@"你的应用中可用字体列表"); for (NSString *familyName in [UIFont familyNames]) { for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) { NSLog(@"%@", fontName); } } }
【解决方案3】:

选择您的标签 点击编辑器并选择适合内容的大小

【讨论】:

  • [labelName sizeToFit];
【解决方案4】:

我认为您的自定义字体会产生问题。您可以使用此代码计算动态大小

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; 

【讨论】:

    【解决方案5】:

    1.从 Xib 你需要设置 no。此标签的第 0 行:

    并使用此方法:

    - (CGFloat)getHeightforController:(id)view{
    UILabel *tempView =(UILabel *)view;
    NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
    context.minimumScaleFactor = 0.8;
    
    float width = tempView.frame.size.width;
    
    width = width * ([[UIScreen mainScreen] bounds].size.width/320);
    
    CGSize size=[tempView.text boundingRectWithSize:CGSizeMake(tempView.frame.size.width, 200)
                                            options:NSStringDrawingUsesLineFragmentOrigin
                                         attributes:@{ NSFontAttributeName : tempView.font}
                                            context:context].size;
    return size.height;
    }
    

    像这样调用这个方法:

    label.text = @"text"
    CGRect frame = cell.lblAddress.frame;
    frame.size.height = [self getHeightforController:label];
    label.frame = frame;
    

    确保在调用此方法之前为标签设置文本

    【讨论】:

    • 我通过编程方式创建了我的 uilabel
    • 那么你也可以应用它。在您创建标签的地方,您需要编写“yourLabel.numberOfLines=0”和“yourLabel.lineBreakMode = NSLineBreakByWordWrapping”
    【解决方案6】:

    使用自动布局或这样做

    yourLabel.numberOfLines = 0;
    yourLabel.lineBreakMode = NSLineBreakByWordWrapping;
    yourLabel.autoresizingMask = UIViewAutoresizingFlexibleHeight;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      相关资源
      最近更新 更多