在布局转换中调整/缩放UICollectionView单元格的内容

时间:2014-03-25 07:08:42

标签: ios ios7 uicollectionview uicollectionviewcell uicollectionviewlayout

我正在讨论来自https://github.com/hebertialmeida/HAPaperViewControllerhttps://github.com/wtmoose/TLLayoutTransitioning的示例项目的CollectionViewLayout的转换,并且无法弄清楚如何在小型和大型布局之间自动调整单元格的内容

E.g。我在CollectionViewCell中有一个UILabel,它应该是定义(固定)位置的单元格宽度的一半。完成到大布局的转换后,标签也应该是单元格的一半(相同的相对位置),但字体大小(或调整大小)。

在此处使用autolayout或使用CGAffineTransformMakeScale缩放contentView?

1 个答案:

答案 0 :(得分:3)

我已更新TLLayoutTransitioning中的“调整大小”示例项目,以演示如何完成此操作。

该方法涉及使用TLLayoutTransitioning回调之一在转换的每个步骤更新字体大小。你可能不想使用仿射变换,因为你会得到大尺寸的模糊缩放文本。

第一步是定义一个设置标签字体大小的方法。你可以使用你喜欢的任何公式,但我已经按照单元格的宽度按比例缩放字体:

- (void)updateLabelScale:(UILabel *)label cellSize:(CGSize)cellSize
{
    CGFloat pointSize = cellSize.width * 17 / 128.f;
    label.font = [UIFont fontWithName:label.font.fontName size:pointSize];
}

您需要在cellForItemAtIndexPath中调用此方法,以确保屏幕上显示的新标签得到正确缩放:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [super collectionView:collectionView cellForItemAtIndexPath:indexPath];
    UILabel *label = (UILabel *)[cell viewWithTag:1];
    ...
    [self updateLabelScale:label cellSize:cell.bounds.size];
    return cell;
}

标签的中心被约束到单元格的中心,大小由intrinsicContentSize决定。因此,当您更改字体时,标签的大小将自动调整为适合。

最后,您将使用updateLayoutAttributes回调根据新的布局属性更新可见单元格的字体大小(您无需担心因为您正在使用而无法看到的单元格关注cellForRowAtIndexPath):

__weak ResizeCollectionViewController *weakSelf = self;
[layout setUpdateLayoutAttributes:^UICollectionViewLayoutAttributes *(UICollectionViewLayoutAttributes *pose, UICollectionViewLayoutAttributes *fromPose, UICollectionViewLayoutAttributes *toPose, CGFloat progress) {
    CGSize cellSize = pose.bounds.size;
    UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:pose.indexPath];
    if (cell) {
        UILabel *label = (UILabel *)[cell viewWithTag:1];
        [weakSelf updateLabelScale:label cellSize:cellSize];
    }
    return nil;
}];