以编程方式创建的 UILabel 的宽度

Posted

技术标签:

【中文标题】以编程方式创建的 UILabel 的宽度【英文标题】:Width of UILabel created programmatically 【发布时间】:2014-03-01 11:34:09 【问题描述】:

我正在尝试以编程方式创建一个适合其内容的UILabel。 我能做的最好的事情是使用NSString's 方法sizeWithAtributes 来获取其内容所需的宽度,然后应用将宽度固定为该值的约束。

这是应该使用自动布局完成的方式吗?

【问题讨论】:

只是 FTR。不要忘记“sizeToFit” 【参考方案1】:

如果你需要一些带有 aoutolayouts 的东西,我试试评论:

    UILabel *testLabel = [UILabel new];
    [testLabel setFont:[UIFont systemFontOfSize:16]];
    [testLabel setText:@"Test text for size context"];
    [testLabel setTextAlignment:NSTextAlignmentLeft];
    [testLabel setNumberOfLines:0]; //0 - infiniy lines if not enough space more
    [testLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; // Autolayout rule: The higher the priority, the more important hold the text.. by horizontal
    [testLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];//some like above but verticale
    [testLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal];// reverse like Hugging but Compression. then lower priority then text croping.
    [testLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisVertical];
    [testLabel preferredMaxLayoutWidth:200];//Start new line each 200 points width
    [testLabel setPreferredMaxLayoutWidth:YES];// resize Font size by label size.
    [testLabel setTranslatesAutoresizingMaskIntoConstraints:NO]; // Disable autolaresize, enable autolayouts

【讨论】:

【参考方案2】:

首先阅读any question about UILabel的最佳答案

还可以使用以下代码创建UILabel的动态大小

UILabel *myLabelName = [[UILabel alloc] init];
myLabelName.backgroundColor = [UIColor redColor];
[myLabelName  setFont: [UIFont fontWithName:@"OpenSans" size:13]]; // set font and it's size as per your requirement.
myLabelName.textAlignment = NSTextAlignmentLeft;
myLabelName.frame = CGRectMake(lblComplainTitle.frame.origin.x + lblComplainTitle.frame.size.width + 7, lblComplainTitle.frame.origin.y +2, 160, 20);
myLabelName.text = @"This is my testing text, This is my testing text, This is my testing text, This is my testing text, This is my testing text, This is my testing text, This is my testing text, This is my testing text, This is my testing text, This is my testing text.";
myLabelName.textColor = [UIColor blackColor];
[self setDynamicHeightOfLabel:myLabelName withLblWidth:160 andFontSize:13]; // here in this function you need to pass object of label with width (as you wabt) and font size
[self.view addSubview:myLabelName];

函数代码,名称为setDynamicHeightOfLabel:withLblWidth:andFontSize

-(void) setDynamicHeightOfLabel:(UILabel *) myLabel withLblWidth:(CGFloat) width andFontSize:(int) fontSize

    CGSize myLabelSize = CGSizeMake(width, FLT_MAX);
    CGSize expecteingmyLabelSize = [myLabel.text sizeWithFont:myLabel.font constrainedToSize:myLabelSize lineBreakMode:myLabel.lineBreakMode];
    CGRect lblFrame = myLabel.frame;
    lblFrame.size.height = expecteingmyLabelSize.height;
    myLabel.frame = lblFrame;
    int addressLine = myLabel.frame.size.height/fontSize;
    myLabel.numberOfLines = addressLine;

我创建函数是因为您可以创建任何具有动态大小的标签,而无需使用重复代码。

【讨论】:

【参考方案3】:

您必须执行几个步骤才能使用autolayout 实现此目的。

    为标签设置布局约束。 将height 约束设置为低优先级。 将numberOfLines 设置为0 以允许多行文本。 为标签设置preferredMaxLayoutWidth

标签使用preferredMaxLayoutWidth 计算其高度。

这个属性影响布局约束时标签的大小 应用于它。在布局期间,如果文本超出宽度 由该属性指定,附加文本流向一个或 更多的新行,从而增加标签的高度。

【讨论】:

【参考方案4】:

您好,您可以通过编程方式管理标签的宽度,

CGRect frame;

frame =self.yourLabel.frame;
frame.size.width +=20;
self.yourLabel.frame=frame;

谢谢

【讨论】:

OP 是关于自动布局的。您不使用自动布局中的矩形。

以上是关于以编程方式创建的 UILabel 的宽度的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 UILabel 上设置 sizeToFit 宽度和高度?

以编程方式并排添加不同宽度的 UILabel

以编程方式动态调整 uilabel 宽度的约束

以编程方式在 UICollectionView 内对齐 UILabel 大小

如何创建具有最大宽度的多行 UILabel?

具有比例宽度和文本驱动高度的动态 UILabel