我有一個UICollectionView,我創建了它的UICollectionViewFlowLayout以編程方式。代碼如下:調整UICollectionViewFlowLayout當UICollectionView幀更改
- (UICollectionView *)createCollectionToDisplayContent:(NSArray *)array ViewWithCellIdentifier:(NSString *)cellIdentifier ofWidth:(CGFloat)width withHeight:(CGFloat)height forEmailView:(EmailView *)emailView
{
CGFloat minInterItemSpacing;
if (!self.orientationIsLandscape) minInterItemSpacing = 9.0f;
else minInterItemSpacing = 20.0f;
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init];
layout.itemSize = CGSizeMake(220.0f, 45.0f);
layout.sectionInset = UIEdgeInsetsMake(5.0f, 0.0f, 5.0f, 0.0f);
layout.minimumLineSpacing = 10.0f;
layout.minimumInteritemSpacing = minInterItemSpacing;
//get pointer to layout so I can change it later
emailView.personLabelsLayout = layout;
UICollectionView *collectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(40, 4, width, height) collectionViewLayout:layout];
collectionView.dataSource = emailView;
collectionView.delegate = emailView;
collectionView.scrollEnabled = NO;
collectionView.userInteractionEnabled = YES;
collectionView.backgroundColor = [UIColor clearColor];
[collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:cellIdentifier];
collectionView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin);
[collectionView reloadData];
return collectionView;
}
此代碼工作正常,最初顯示集合視圖。我的問題是在設備旋轉時嘗試更改流佈局。我使用struts和spring處理集合視圖框架中的更改(請參閱上文),並在willAnimateRotationToInterfaceOrientation方法中調整流佈局的minimumInterItemSpacing屬性,最後調用集合視圖上的重新加載數據。下面是該代碼:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
CGFloat minInterItemSpacing;
if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {
minInterItemSpacing = 20.0f;
} else {
minInterItemSpacing = 9.0f;
}
self.visibleEmailView = //...more code
self.visibleEmailView.personLabelsLayout.minimumInteritemSpacing = minInterItemSpacing;
[self.visibleEmailView.personLabelsCollectionView reloadData];
//other stuff...
}
最終,當視圖旋轉時,流佈局應顯着調整:在minimumInterItemSpacing方面,而且在它顯示的列數的條款。但是,佈局並未像我預期的那樣調整。我很難弄清究竟究竟發生了什麼。它看起來像minimumInterItemSpacing沒有被重置在旋轉,它看起來像每個單元格,同一單元格被多次繪製自己。另外,我越來越崩潰是說:
"the collection view's data source did not return a valid cell from -collectionView:cellForItemAtIndexPath: for index path <NSIndexPath 0x9be47e0> 2 indexes [0, 6]"
在試圖開始縮小是怎麼回事就在這裏,我想知道如果任何人都可以告訴我,如果我的做法是正確的,和/或有在我的代碼中的一個明顯的錯誤,可能會導致一些或所有這種時髦的行爲。
謝謝 - 我剛剛嘗試在重置佈局的minimumInterItemSpacing [layout invalidateLayout]之前添加它,然後重新加載集合視圖,但這似乎無法解決問題。 – jac300