Ios UILabel-自动调整标签大小以适应文本?
是否可以自动调整UILabel框/边界的大小以适应包含的文本? (我不在乎它是否比显示器大)Ios UILabel-自动调整标签大小以适应文本?,ios,iphone,objective-c,uilabel,Ios,Iphone,Objective C,Uilabel,是否可以自动调整UILabel框/边界的大小以适应包含的文本? (我不在乎它是否比显示器大) 因此,如果用户输入“hello”或“我的名字很长,我希望它能放在这个框中”,它永远不会被截断,标签也会相应地“加宽”?请查看我的要点,我为UILabel做了一个分类,用于类似的东西,my category允许UILabel拉伸其高度以显示所有内容: 或者查看此帖子: 这会拉伸高度,但你可以很容易地改变它,以另一种方式工作,并通过类似的方式拉伸宽度,我相信这就是你想要做的: @implementation
因此,如果用户输入“hello”或“我的名字很长,我希望它能放在这个框中”,它永远不会被截断,标签也会相应地“加宽”?请查看我的要点,我为
UILabel
做了一个分类,用于类似的东西,my category允许UILabel
拉伸其高度以显示所有内容:
或者查看此帖子:
这会拉伸高度,但你可以很容易地改变它,以另一种方式工作,并通过类似的方式拉伸宽度,我相信这就是你想要做的:
@implementation UILabel (dynamicSizeMeWidth)
- (void)resizeToStretch{
float width = [self expectedWidth];
CGRect newFrame = [self frame];
newFrame.size.width = width;
[self setFrame:newFrame];
}
- (float)expectedWidth{
[self setNumberOfLines:1];
CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX);
CGSize expectedLabelSize = [[self text] sizeWithFont:[self font]
constrainedToSize:maximumLabelSize
lineBreakMode:[self lineBreakMode]];
return expectedLabelSize.width;
}
@end
您可以更简单地使用UIView
类中提供的sizeToFit
方法,但将行数设置为1以确保安全
iOS 6更新 如果您使用的是自动布局,那么您有一个内置的解决方案。通过将行数设置为0,框架将适当调整标签大小(增加更多高度),以适合文本
iOS 8更新
sizeWithFont:
已被弃用,因此请改用sizeWithAttributes:
:
- (float)expectedWidth{
[self setNumberOfLines:1];
CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];
return expectedLabelSize.width;
}
这是分类法。您必须先设置文本,然后调用此方法来调整UILabel的高度。我根据上面Daniel的回答创建了一些方法
-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text
{
CGSize maximumLabelSize = CGSizeMake(290, FLT_MAX);
CGSize expectedLabelSize = [text sizeWithFont:label.font
constrainedToSize:maximumLabelSize
lineBreakMode:label.lineBreakMode];
return expectedLabelSize.height;
}
-(void)resizeHeightToFitForLabel:(UILabel *)label
{
CGRect newFrame = label.frame;
newFrame.size.height = [self heightForLabel:label withText:label.text];
label.frame = newFrame;
}
-(void)resizeHeightToFitForLabel:(UILabel *)label withText:(NSString *)text
{
label.text = text;
[self resizeHeightToFitForLabel:label];
}
使用
[label sizeToFit]
将从Daniels类别中获得相同的结果
尽管我建议使用autolayout并让标签根据约束自行调整大小 使用
[label sizeToFit]
要调整UILabel中的文本,还有以下方法:
[self.myLabel changeTextWithAutoHeight:self.myStringToAssignToLabel width:180.0f];
您可以使用两种方法根据文本和其他相关控件调整标签的大小-
CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{
NSFontAttributeName : labelFont
}
context:nil].size;
CGSize labelTextSize = [label.text sizeWithFont:label.font
constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT)
lineBreakMode:NSLineBreakByWordWrapping];
//基于labelTextHeight重新构造其他控件
CGFloat labelTextHeight = labelTextSize.height;
[label setNumberOfLines:0]; // for multiline label
[label setText:@"label text to set"];
[label sizeToFit];// call this to fit size of the label according to text
//在此之后,您可以让标签框架重新构造其他相关控件如果我们希望
UILabel
根据文本大小收缩和扩展,那么带有自动布局的故事板是最佳选择。以下是实现这一目标的步骤
台阶
UILabel
的numberOfLines
属性放置0
更新帧
,然后单击修复错位
。现在,如果文本较少,此UILabel将缩小,如果文本较多,则会展开[label sizeToFit]代码>在viewDidLoad中
这并不像其他一些答案那样复杂 钉住左边缘和上边缘 只需使用“自动布局”添加约束即可固定标签的左侧和顶部 之后,它将自动调整大小 笔记
- 不要为宽度和高度添加约束。标签具有基于其文本内容的固有大小
- 谢谢你的帮助
- 使用自动布局时,无需设置
。示例项目的完整代码如下:sizeToFit
import UIKit class ViewController: UIViewController { @IBOutlet weak var myLabel: UILabel! @IBAction func changeTextButtonTapped(sender: UIButton) { myLabel.text = "my name is really long i want it to fit in this box" } }
- 如果希望标签换行,请在IB中将行数设置为0,并在代码中添加
myLabel.preferredMaxLayoutWidth=150//或任何内容。(我还将按钮固定在标签底部,以便在标签高度增加时向下移动。)
- 如果要在
中查找动态调整标签大小,请参阅UITableViewCell
我在自动布局方面遇到了很大的问题。 我们有两个容器在桌子的格子里。第二个容器的大小取决于项目描述(0-1000个字符),行的大小应该根据它们来调整 缺少的成分是描述的底部约束 我已将动态元素的底部约束从=0更改为=0每次都适合!)
您可以显示一行输出,然后设置属性line=0,显示多行输出,然后设置属性line=1和更多
[self.yourLableName sizeToFit];
以下是我发现对我的情况有效的方法: 1) UILabel的高度具有使用autolayout的>=0约束。宽度是固定的。 2) 将文本分配到UILabel中,此时它已经有一个superview(不确定这有多重要)。 3) 然后,做:
label.sizeToFit()
label.layoutIfNeeded()
标签的高度现在已适当设置。使用iOS 6自动布局方法,我无法摆脱标签上的高度限制。将高度约束的关系设置为“大于或等于”允许高度增长。当文本小于/大于时,ios 7UILabel中去除摩擦的sizeWithFont:constrainedToSize:lineBreakMode:方法不会调整自身大小。我使用自动布局。尝试制作UILabel,但每次初始化CellForRowatinex时都会创建UILabel。尝试了很多东西。对我来说没什么用。uilabel的背景采用相同的宽度。救命啊@Daniel我将行数设置为0,但它不起作用。我已经设置了水平和垂直中心的约束。我做的另一件事是创建UILABEL的子类,并将其用于LabelWith Autolayout最简单的解决方案是:(1)将线条设置为0,(2)将宽度约束设置为常数0的“大于或等于”,将高度约束设置为常数0的“大于或等于”,以及(4)按照通常的方式对齐,例如,将水平线居中
[self.yourLableName sizeToFit];
label.sizeToFit()
label.layoutIfNeeded()