2013-08-23 26 views
0

我有一個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]" 

在試圖開始縮小是怎麼回事就在這裏,我想知道如果任何人都可以告訴我,如果我的做法是正確的,和/或有在我的代碼中的一個明顯的錯誤,可能會導致一些或所有這種時髦的行爲。

回答

0

你正在實施這樣的事情嗎?

- (BOOL) shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { 
    return YES; 
] 
+0

謝謝 - 我剛剛嘗試在重置佈局的minimumInterItemSpacing [layout invalidateLayout]之前添加它,然後重新加載集合視圖,但這似乎無法解決問題。 – jac300

相關問題