0

我有一个UICollectionView水平UICollectionViewCell和垂直居中的UILabel。由于标签包含不同长度的文本,我这样计算标签的宽度。我在这里给它一点边距(10)以防备。

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *text = [_collectionViewProvider collectionViewController:self titleForRow:indexPath.row];
    CGSize size = CGSizeMake(MIN(_maxWidth, [text sizeWithFont:self.font].width + 16 + 10), CGRectGetHeight(collectionView.bounds));

    return size;
}

因为我想让用户有水平滚轮的印象,所以我应用了一个变换并根据与中心的距离调整单元格的 zIndex。它几乎可以按预期工作,但是当在最左边/最右边应用变换时,帧宽度会缩小,我的效果是文本被剪辑,这看起来很奇怪。

这是显示效果以及单元格何时位于中心的图像。有人知道如何解决这个问题吗?

在此处输入图像描述

在此处输入图像描述

这是我计算布局的代码。

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSArray *array = [super layoutAttributesForElementsInRect:rect];
    CGRect visibleRect = CGRectZero;
    visibleRect.origin = self.collectionView.contentOffset;
    visibleRect.size = self.collectionView.bounds.size;

    CGFloat activeDistance = floorf(CGRectGetWidth(visibleRect) / 2);
    CGFloat midX = ceilf(CGRectGetMidX(visibleRect));
    CGFloat baseAngle = M_PI/180 * 40;
    for (UICollectionViewLayoutAttributes *attributes in array)
    {
        if (CGRectContainsRect(visibleRect, attributes.frame)) {
            CGFloat distance = midX - attributes.center.x;
            attributes.alpha = (activeDistance - ABS(distance))/activeDistance;

            CGFloat value = -distance/activeDistance;
            value *= baseAngle;
            attributes.transform3D = CATransform3DMakeRotation(value, 0, 1, 0);

            attributes.zIndex = ABS(distance)/activeDistance * 200;
        }
        else {
            attributes.alpha = 0;
        }
    }
    return array;
}
4

0 回答 0