我在这里创建了一个非常基本的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;
}
答案 0 :(得分:1)
有趣的问题 - 阴影总是会导致问题,不是吗?如果我理解正确,问题不是阴影没有出现,而是阴影不是尊重细胞的新界限。
通常,将此类自定义属性应用于单元格的最佳位置是覆盖applyLayoutAttributes:
。但是,在这种情况下,它会变得棘手。这是因为,与应用属于UIKit的隐式动画属性不同,阴影是在单元格的CALayer上设置的,这意味着要获得阴影的动画,您可能需要一个明确的{{1} }。
使用显式动画的问题在于无法在运行时确定动画的持续时间。另外,假设你想在没有动画的情况下从一种布局转换到另一种布局。 UICollectionView API中没有任何工具可以处理它。
你真的遇到了苹果工程师可能没有预料到的一系列问题。我不相信你有很多选择。覆盖CAAnimation
并摆弄显式动画可能会有效,但是我有前面提到的限制。您最好的选择可能是创建一个可调整大小的applyLayoutAttributes:
来表示您的影子,然后将UIImage
添加到单元格的视图层次结构中,以便随着单元格的增长和缩小,图像视图与阴影。我知道从代码的角度来看,这不是一个令人满意的答案,但它是最通用的答案,会导致最少的挫折感。