根据Apple的文档(并在WWDC 2012上大肆宣传),可以UICollectionView
动态设置布局,甚至为更改设置动画:
通常,在创建集合视图时可以指定布局对象,但是也可以动态更改集合视图的布局。布局对象存储在collectionViewLayout属性中。设置此属性可直接更新布局,而无需设置更改动画。如果要对更改进行动画处理,则必须改为调用setCollectionViewLayout:animated:方法。
但是,实际上,我发现对UICollectionView
进行了莫名其妙甚至无效的更改contentOffset
,导致单元无法正确移动,从而使该功能实际上无法使用。为了说明问题,我将以下示例代码放在一起,可以将其附加到放置在情节提要中的默认集合视图控制器上:
#import <UIKit/UIKit.h>
@interface MyCollectionViewController : UICollectionViewController
@end
@implementation MyCollectionViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"CELL"];
self.collectionView.collectionViewLayout = [[UICollectionViewFlowLayout alloc] init];
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return 1;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:@"CELL" forIndexPath:indexPath];
cell.backgroundColor = [UIColor whiteColor];
return cell;
}
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"contentOffset=(%f, %f)", self.collectionView.contentOffset.x, self.collectionView.contentOffset.y);
[self.collectionView setCollectionViewLayout:[[UICollectionViewFlowLayout alloc] init] animated:YES];
NSLog(@"contentOffset=(%f, %f)", self.collectionView.contentOffset.x, self.collectionView.contentOffset.y);
}
@end
控制器设置默认值UICollectionViewFlowLayout
,viewDidLoad
并在屏幕上显示单个单元格。选择单元格后,控制器将创建另一个默认值,UICollectionViewFlowLayout
并使用animated:YES
标志在收集视图上进行设置。预期的行为是该单元格不移动。但是,实际的行为是该单元格在屏幕外滚动,这时甚至不可能将其滚动到屏幕上。
查看控制台日志,发现contentOffset发生了莫名其妙的更改(在我的项目中,从(0,0)更改为(0,205))。我针对非动画案例发布了解决方案(i.e. animated:NO
),但是由于我需要动画,因此我非常想知道是否有人针对动画案例有解决方案或解决方法。
附带说明一下,我已经测试了自定义布局并获得了相同的行为。