我在 IB 中将 numberOfLines 设置为 1,但是当我将文本设置为长字符串时,它不会截断。如果我将 numberOfLines 设置为 2,则截断工作正常。我应该怎么做才能将长字符串截断成一行?
9 回答
很简单,设置以下属性:
label.adjustsFontSizeToFitWidth = NO;
label.lineBreakMode = NSLineBreakByTruncatingTail;
如果您使用属性字符串并将段落样式设置为属性字符串:请确保您通过paragraphStyle.lineBreakMode = .byTruncatingTail
.
如果使用自动布局,就我而言,缺少约束。如果没有对其宽度/尾随设置约束,则 UILabel 会增加其宽度。一旦它的宽度受到限制,例如它的超级视图,就会发生截断。
您可能对该部分中的标签有限制,这会使事情变得混乱。
仔细检查您的约束或删除该部分中该标签或其他控件的约束。
标签的故事板选项:“换行符:截断尾巴”将用于您正在寻找的工作。
如果在 IB 中将标签的 autoshrink 设置为“Fixed Font Size”,则当字符串宽度超出标签宽度时,您将始终得到截断。我猜你碰巧将它设置为“最小字体比例”或“最小字体字体”,当字符串太长时会导致调整大小。
(Xcode 4.5,其他版本的Xcode和IB可能属性名不同)
我做了两个函数,这将帮助你完成你的工作。
基本:我为任务制作的这个解决方案:
“将字体最小化为我的最小字体大小,然后尽可能多地放置信息,但不要大于最大宽度”
takeFineFont... 函数参数:
(UIFont*)font
- 标签的字体 ( titleLabel.font
)
(NSString*)string
- 标签中的文本 ( titleLabel.text
)
(CGSize)limitStringSize
- 限制大小。
limitStringSize.width
- 标签的宽度限制(上限)
limitStringSize.height
- 标签的高度限制(下限)(实际上是字体大小)
-(UIFont*)takeFineFontSize:(UIFont*)font
forText:(NSString*)string
andLimit:(CGSize)limitStringSize{
UIFont* resultFont = [UIFont fontWithName:[font fontName] size:[font pointSize]];
if(limitStringSize.width != 0 && limitStringSize.height != 0){
CGSize currentSize = [string sizeWithFont:resultFont];
while(/* change font width with upper bound */
currentSize.width > limitStringSize.width
&&
/* change font height with lower bound */
currentSize.height > limitStringSize.height){
/*change height and take new width*/
currentSize.height -= 1;
currentSize.width = [string sizeWithFont:[resultFont fontWithSize:currentSize.height]].width;
}
resultFont = [resultFont fontWithSize:currentSize.height];
}
return resultFont;
}
-(double)takeFineWidthForFont:(UIFont*)font
forString:(NSString*)string
andLimit:(double)widthLimit{
return MIN([string sizeWithFont:font].width, widthLimit);
}
假设你有大字符串UILabel* titleLabel
并且你在某处定义:
#define maximumLengthOfYourLabel 300
#define minimumSizeOfFont 14
你现在要做什么?只需执行以下代码即可:
-(void)updateTitleLabelWithBigText:(NSString*)string{
/*change text*/
self.titleLabel.text = string;
/*take pretty small font*/
self.titleLabel.font = [self takeFineFontSize:self.titleLabel.font
forText:self.titleLabel.text
andLimit:CGSizeMake(maximumLengthOfYourLabel,minimumSizeOfFont)
];
/*if your text still big, take minimal width and trunctate it*/
self.titleLabel.width = [self takeFineWidthForFont:self.titleLabel.font
forString:self.titleLabel.text
andLimit:maximumLengthOfYourLabel];
self.titleLabel.lineBreakMode = NSLineBreakByTruncatingTail;
}
确保你没有sizeToFit()
在你的标签上打电话。它将覆盖标签和约束设置。
将 numberOfLines 设置为 0,这将使您可以垂直扩展 uilabel 内容而不会截断其宽度。
也许这种方法可以帮助你:
[myLabel sizeToFit];
标签不会被截断,但会调整标签大小以适合一行。