UILabel不会自动缩小文本以适应标签大小
我有这个奇怪的问题,即时通讯处理现在超过8小时..根据情况我必须dynamic地计算UILabels
大小,
例如
我的UIViewController
收到一个事件,我改变UILabels
大小。 从大到小。 我的UILabel
的大小变小,我得到正确的需要的大小,但我的UILabel
文本保持不变,相同的字体大小等我需要的字体变小,整个文本适合UILabel
。 所以问题是如何使文本适合我的标签自动autoshrinking
或类似的东西?
在我的xib
, UILabels
autoshrink
被选中, 行数也被设置为0,并且我的string也有新的行符号(\ n),并且我已经select了linebreakmode转换为wordwrap
。 也许任何人和我现在一样,可以帮助我吗? 我真的很感激。
提前致谢!
编辑: UILabel
最小字体大小设置为10
如果你还在寻找更好的解决scheme,我想这是你想要的:
一个布尔值,指示是否应该减小字体大小以便将标题string合并到标签的边界矩形中。 (只有在numberOfLines属性设置为1时,此属性才有效。)
@property(nonatomic) BOOL adjustsFontSizeToFitWidth
一个布尔值,指示是否应调整字母之间的间距以适应标签边界矩形内的string。
@property(nonatomic) BOOL adjustsLetterSpacingToFitWidth
来源 。
这是我如何得到UILabel Autoshrink
工作(特别是标签字体在6s加上故事板4s装置的高度)在iOS 9.2,Xcode 7.2 …
- 行数是0
- 换行符:剪辑
- Autoshrink:最小字体比例0.25
minimumFontSize
在iOS 6中已弃用。
所以使用minimumScaleFactor
而不是minmimumFontSize
。
lbl.adjustsFontSizeToFitWidth=YES; lbl.minimumScaleFactor=0.5;
也是我的解决scheme是布尔label.adjustsFontSizeToFitWidth = YES; 但。 您必须在界面生成器中将Word Wrapping切换到“ CLIP ”。 然后自动缩小标签。 这个非常重要。
你可以写
UILabel *reviews = [[UILabel alloc]initWithFrame:CGRectMake(14, 13,270,30)];//Set frame reviews.numberOfLines=0; reviews.textAlignment = UITextAlignmentLeft; reviews.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:12]; reviews.textColor=[UIColor colorWithRed:0.0/255.0 green:0.0/255.0 blue:0.0/255.0 alpha:0.8]; reviews.backgroundColor=[UIColor clearColor];
你可以计算这样的线数
CGSize maxlblSize = CGSizeMake(270,9999); CGSize totalSize = [reviews.text sizeWithFont:reviews.font constrainedToSize:maxlblSize lineBreakMode:reviews.lineBreakMode]; CGRect newFrame =reviews.frame; newFrame.size.height = totalSize.height; reviews.frame = newFrame; CGFloat reviewlblheight = totalSize.height; int lines=reviewlblheight/12;//12 is the font size of label
UILabel *lbl=[[UILabel alloc]init]; lbl.frame=CGRectMake(140,220 , 100, 25);//set frame as your requirement lbl.font=[UIFont fontWithName:@"Arial" size:20]; [lbl setAutoresizingMask:UIViewContentModeScaleAspectFill]; [lbl setLineBreakMode:UILineBreakModeClip]; lbl.adjustsFontSizeToFitWidth=YES;//This is main for shrinking font lbl.text=@"HelloHelloHello";
希望这会帮助你:-)等待你的回复
那么最后我没有find我的答案。 而且我认为autoshrink不适用于多行。 我结束了在这个链接中使用build议: 在多行UILabel autoshrink
解决scheme是在给定的宽度下计算文本高度,如果文本较大,则缩小字体大小,然后再重复,直到高度等于或小于所需的大小。
我不明白为什么这么难实施。 如果我失去了一些东西,欢迎大家纠正我:)
我认为你可以在alloc init Label之后编写下面的代码
UILabel* lbl = [[UILabel alloc]initWithFrame:CGRectMake(0, 10, 280, 50)]; lbl.text = @"vbdsbfdshfisdhfidshufidhsufhdsf dhdsfhdksbf hfsdh fksdfidsf sdfhsd fhdsf sdhfh sdifsdkf ksdhfkds fhdsf dsfkdsfkjdhsfkjdhskfjhsdk fdhsf "; [lbl setMinimumFontSize:8.0]; [lbl setNumberOfLines:0]; [lbl setFont:[UIFont systemFontOfSize:10.0]]; lbl.lineBreakMode = UILineBreakModeWordWrap; lbl.backgroundColor = [UIColor redColor]; [lbl sizeToFit]; [self.view addSubview:lbl];
它正在与我合作使用它
两年了,这个问题还在…
在iOS 8 / XCode 6.1中,我有时会发现,我的UILabel
(在UITableViewCell
创build,AutoLayout打开,灵活的约束,所以它有足够的空间)不会调整自己以适应文本string。
与往年一样,解决scheme是设置文本, 然后调用sizeToFit
。
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { . . . cell.lblCreatedAt.text = [note getCreatedDateAsString]; [cell.lblCreatedAt sizeToFit]; }
(叹。)
在iOS 9中,我只需要:
- 将标签的左侧和右侧约束添加到超级视图。
- 将换行符模式设置为在IB中裁剪。
- 在IB中将行数设置为1。
有人build议将行数设置为0,但对于我来说,这只是使标签去多行…
在Swift 3(编程)我不得不这样做:
let lbl = UILabel() lbl.numberOfLines = 0 lbl.lineBreakMode = .byClipping lbl.adjustsFontSizeToFitWidth = true lbl.minimumScaleFactor = 0.5 lbl.font = UIFont.systemFont(ofSize: 15)
下面是如何做到这一点。假设以下消息标签是你想要的效果的标签。现在,试试这些简单的代码行:
//SET THE WIDTH CONSTRAINTS FOR LABEL. CGFloat constrainedWidth = 240.0f;//YOU CAN PUT YOUR DESIRED ONE,THE MAXIMUM WIDTH OF YOUR LABEL. //CALCULATE THE SPACE FOR THE TEXT SPECIFIED. CGSize sizeOfText=[yourText sizeWithFont:yourFont constrainedToSize:CGSizeMake(constrainedWidth, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap]; UILabel *messageLabel=[[UILabel alloc] initWithFrame:CGRectMake(20,20,constrainedWidth,sizeOfText.height)]; messageLabel.text=yourText; messageLabel.numberOfLines=0;//JUST TO SUPPORT MULTILINING.
如果numberOfLines > 1
不起作用我做了这样的条件 –
if(lblRecLocation.text.length > 100) lblRecLocation.font = [UIFont fontWithName:@"app_font_name" size:10];
晚会迟到了,但是因为我有额外的要求,每行只有一个字,这个加法对我来说是个窍门:
label.numberOfLines = [labelString componentsSeparatedByString:@" "].count;
苹果文件说:
通常情况下,标签文本是用您在font属性中指定的字体绘制的。 但是,如果此属性设置为YES,并且text属性中的文本超过了标签的边界矩形,接收器将开始缩小字体大小,直到string适合或达到最小字体大小。 在iOS 6及更早版本中,只有当numberOfLines属性设置为1时,此属性才有效。
但这是一个谎言。 我告诉你一个谎言! 所有iOS版本都是如此。 具体来说,在UICollectionViewCell
使用UILabel
时,这是正确的, UICollectionViewCell
的大小由运行时通过自定义布局(例如self.menuCollectionViewLayout.itemSize = size
)dynamic调整的约束决定。
因此,当与前面的答案中提到的adjustsFontSizeToFitWidth
和minimumScaleFactor
一起使用时,以编程方式设置基于字数的numberOfLines
解决了自动收缩问题。 根据字数甚至字符数做类似的事情可能会产生一个“足够接近”的解决scheme。
这是Swift 3运行Xcode 8.2.1(8C1002)
我发现的最佳解决scheme是在标签上的Storyboard或IB中设置固定宽度。 用限制边距来设置你的约束。 在你的viewDidLoad中添加下面几行代码:
override func viewDidLoad() { super.viewDidLoad() label.numberOfLines = 1 label.adjustsFontSizeToFitWidth = true label.minimumScaleFactor = 0.5 }
这工作就像一个魅力,它不会溢出到一个新的行,缩小文本,以适应标签的宽度,没有任何奇怪的问题,并在Swift 3工程。