应用变换时,UILabel会被剪裁

时间:2013-08-05 08:29:04

标签: ios uilabel uicollectionview catransform3d

我有一个水平UICollectionViewUICollectionViewCell水平和垂直居中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。它的工作方式几乎和预期的一样,但是当最左边/右边的变换被框架宽度缩小时,我的效果就是文本被剪裁了,看起来很奇怪。

这是显示效果以及细胞位于中心的图像。 有谁知道如何解决这个问题?

enter image description here

enter image description here

这是我计算布局的代码。

- (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;
}

0 个答案:

没有答案