我在UIViewController
工作,UICollectionView
以标准网格布局排列,allowsMultipleSelection = NO
。当用户选择一个单元格(通过handleTap UITapGestureRecognizer
选择)时,我想要执行以下一项或所有操作:
(1)突出显示/为单元格着色不同的颜色 - 更改其alpha和背景颜色
(2)稍微放大细胞而不改变其周围的任何其他细胞
(3)在修改后的单元框架或边界周围绘制边框
我目前正在使用以下函数,尽管选择了正确划分的单元格并且存储在局部变量selectedCell
中,但它永远不会被调用。
-(CGSize) collectionView:(UICollectionView*)collectionView layout:(UICollectionViewFlowLayout*)layout sizeForItemAtIndexPath: (NSIndexPath*)indexPath
{
if ([indexPath isEqual:selectedCellIndexPath])
{
return CGSizeMake([MyCollectionViewCell width] + 4, [MyCollectionViewCell height] + 4);
} else {
return CGSizeMake([MyCollectionViewCell width], [MyCollectionViewCell height]);
}
}
我也尝试过这里建议的布局无效,但无论出于什么原因,它会在我选择的单元格周围创建一个巨大的缓冲区,扰乱周围的所有其他单元格(导致它们移动到新位置),以及然而我放大的自定义单元格内的内容(imageView)不会放大。即尽管我专门改变了imageView.frame和imageView.image的大小,但它内部的imageView仍保持相同的大小:UICollectionView: Animate cell size change on selection
以下是更多示例代码,即使它在选定的单元格上执行也不起作用:
-(void) collectionView:(UICollectionView*)collectionView didSelectItemAtIndexPath:(NSIndexPath*)indexPath
{
NSLog(@"Cell Selected!");
MyCollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"StorageCell" forIndexPath:indexPath];
MyImageView* selectedCellView = cell.imgView;
MyCollectionViewFlowLayout* layout = (MyCollectionViewFlowLayout*)self.collection.collectionViewLayout;
layout.currentCellPath = indexPath;
layout.currentCellCenter = selectedCellView.center;
layout.currentCellScale = 1.25;
[self.collection.collectionViewLayout invalidateLayout];
// Animate
[UIView transitionWithView:cell duration:0.1f options: UIViewAnimationOptionCurveLinear animations:^(void)
{
CGRect frame = cell.frame;
frame.size = CGSizeMake(60.0, 100.0);
cell.frame = frame;
selectedCellView.imgView.image = [UIImage imageNamed:@"wood2.png"];
[self.collection reloadItemsAtIndexPaths:@[indexPath]];
NSLog(@"Cell Frame animated to: %f,%f", cell.frame.size.width, cell.frame.size.height);
frame = selectedCellView.frame;
frame.size.width = 1.25*frame.size.width;
frame.size.height = 1.25*frame.size.height;
selectedCellView.frame = frame;
frame = selectedCellView.imgView.frame;
frame.size.width = 1.25*frame.size.width;
frame.size.height = 1.25*frame.size.height;
selectedCellView.imgView.frame = frame;
UICollectionViewLayoutAttributes* attrib = [collection layoutAttributesForItemAtIndexPath:indexPath];
attrib.transform3D = CATransform3DMakeScale(2, 2, 1.0);
selectedCellView.imgView.frame.transform = CGAffineTransformScale(selectedCellView.imgView.transform, 1.1, 1.1);
}
completion:nil];
}
答案 0 :(得分:9)
您不需要调用invalidateLayout来执行这些动画。
通过调用
获取didSelectItemAtIndexPath
中的单元格实例
MyCollectionViewCell* cell = [collectionView cellForItemAtIndexPath:indexPath];
为细胞制作动画。
以下是我用来缩放单元格的代码段。
[self animateZoomforCell:cell];
// ---方法实施 - //
-(void)animateZoomforCell:(MyCollectionViewCell*)zoomCell
{
[UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
zoomCell.transform = CGAffineTransformMakeScale(1.6,1.6);
} completion:^(BOOL finished){
}];
}