AutoLayout - 将 UILabel 调整为它的 Superview 并调整它的大小

Posted

技术标签:

【中文标题】AutoLayout - 将 UILabel 调整为它的 Superview 并调整它的大小【英文标题】:AutoLayout - Resizing UILabel to its Superview and sizing it 【发布时间】:2013-08-15 15:52:45 【问题描述】:

我有一个UICollectionView,其中包含一些单元格。

每个单元格中都包含一个UILabel。标签内有一个字母,它充当瓷砖(因此)。当更多单元格被添加到UICollectionView 时,UICollectionViewCells 会更改大小,如下所示:

-(CGSize)collectionView:(UICollectionView *)collectionView 
                 layout:(UICollectionViewLayout *)collectionViewLayout 
 sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
//    NSLog(@"%s",__PRETTY_FUNCTION__);

    NSLog(@"the word array count is: %i",self.wordArray.count);
    if (self.wordArray.count <= 5) 
        return CGSizeMake(50,50);
     else if (self.wordArray.count <= 6 ) 
        return CGSizeMake(30, 30);
     else if (self.wordArray.count <= 8 ) 
        return CGSizeMake(10, 10);
     else 
        return CGSizeMake(100,100);
    


我现在要做的是在每次更改布局时重新调整单元格内的UILabel 大小。如何使用AutoLayout 使标签大小适合单元格大小?另外如何根据UILabel 大小更新字体大小?

【问题讨论】:

【参考方案1】:

您可以设置如下布局约束:

NSDictionary *viewDictionary = NSDictionaryOfVariableBindings(label);
NSDictionary *insetMetrics = @
    @"left" : @(10.0f),
    @"right" : @(10.0f),
    @"top" : @(10.0f),
    @"bottom" : @(10.0f)
;

[cell addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(left)-[label]-(right)-|" options:kNilOptions metrics:insetMetrics views:viewDictionary]];
[cell addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(top)-[label]-(bottom)-|" options:kNilOptions metrics:insetMetrics views:viewDictionary]];

如果您设置了正确的属性,UILabel 中的文本会自动缩小(参见UILabel Class Reference)。因此,如果您最初将字体大小设置为您希望最大单元格的大小,随着标签的缩小,文本也会随之缩小。

【讨论】:

不幸的是,这不起作用。我添加了'self.letterLabel.adjustsFontSizeToFitWidth = YES;'以及上面对单元格初始化方法的限制。 奇怪,它对我有用。你设置minimumScaleFactor了吗? 奇怪的是在 IB 中。我认为问题更多在于应该在哪里设置。我需要的是标签框架与单元格框架相匹配,并且标签中的文本可以缩放到该效果。应该在单元格初始化中还是在“cellForItemAtIndexPath”中设置(如上所述)? 您能在界面生成器中完成所有操作吗?我快速测试了一个带有视图的笔尖,在视图中放置标签,并设置自动布局约束(和最小比例因子),如上所述。然后,如果您调整视图大小,您应该会看到标签随之调整大小,当标签对于文本而言太小时,文本也会随之调整大小。 如何在 IB 中设置这些约束?这是我第一次使用 AutoLayout 并且缺少文档。【参考方案2】:

在 IB 中重新创建它是可行的。我能够将单元格本身中标签两侧的水平/垂直约束设置为 0/所需,这很有效。

【讨论】:

以上是关于AutoLayout - 将 UILabel 调整为它的 Superview 并调整它的大小的主要内容,如果未能解决你的问题,请参考以下文章

AutoLayout 将 UILabel 高度设置为零

在iOS中使用autolayout调整内容大小的UILabel

AutoLayout 在地图标注中动态调整 UILabel 高度和宽度?

使用 Interface Builder 和 Autolayout 在 UIScrollView 中正确调整 UILabel 的大小?

iOS Autolayout:调整大小父视图中的 UILabels 问题

Autolayout,几个UILabels,每行,相同的字体大小?