如何修复UICollectionViewFlowLayout转换不将样式应用于单元格?

时间:2014-08-30 06:34:07

标签: ios uicollectionview uicollectionviewcell uicollectionviewlayout

我在这里创建了一个非常基本的UICollectionView并进行了布局转换: https://github.com/aubrey/TestCollectionView

我的问题有一个视频: http://cl.ly/XHjZ

我的问题是我不知道在哪里/如何应用我正在添加到单元格中的阴影。每当我添加它时,它都无法正确应用于转换后的单元格,并在我转换回来后挂起。

在我的didSelectItemAtIndexPath方法中,我尝试在这里应用阴影(无效):

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath  {

if (self.collectionView.collectionViewLayout == self.smallLayout)
{
    [self.largeLayout invalidateLayout];
    [self.collectionView setCollectionViewLayout:self.largeLayout animated:YES];
    [self.collectionView setPagingEnabled:YES];
}

else
{
    [self.smallLayout invalidateLayout];
    [self.collectionView setCollectionViewLayout:self.smallLayout animated:YES];
    [self.collectionView setPagingEnabled:NO];

}
}

我还在我设置自定义单元格的地方应用了阴影:

@implementation MyCell

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {

    self.contentView.backgroundColor = [UIColor whiteColor];

    self.myNumber = [UILabel new];
    self.myNumber.text = @"Data Array Didn't Load";
    self.myNumber.frame = CGRectMake(20, 20, 100, 100);
    [self.contentView addSubview:self.myNumber];

//       Shadow Setup
        self.layer.masksToBounds = NO;
        self.layer.shadowOpacity = 0.15f;
        self.layer.shadowRadius = 1.4f;
        self.layer.shadowOffset = CGSizeZero;
        self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.bounds].CGPath;

}
return self;
}

1 个答案:

答案 0 :(得分:1)

有趣的问题 - 阴影总是会导致问题,不是吗?如果我理解正确,问题不是阴影没有出现,而是阴影不是尊重细胞的新界限。

通常,将此类自定义属性应用于单元格的最佳位置是覆盖applyLayoutAttributes:。但是,在这种情况下,它会变得棘手。这是因为,与应用属于UIKit的隐式动画属性不同,阴影是在单元格的CALayer上设置的,这意味着要获得阴影的动画,您可能需要一个明确的{{1} }。

使用显式动画的问题在于无法在运行时确定动画的持续时间。另外,假设你想在没有动画的情况下从一种布局转换到另一种布局。 UICollectionView API中没有任何工具可以处理它。

你真的遇到了苹果工程师可能没有预料到的一系列问题。我不相信你有很多选择。覆盖CAAnimation并摆弄显式动画可能会有效,但是我有前面提到的限制。您最好的选择可能是创建一个可调整大小的applyLayoutAttributes:来表示您的影子,然后将UIImage添加到单元格的视图层次结构中,以便随着单元格的增长和缩小,图像视图与阴影。我知道从代码的角度来看,这不是一个令人满意的答案,但它是最通用的答案,会导致最少的挫折感。