2

我有一個UICollectionViewController是導航控制器和選項卡欄控制器的一部分。在導航控制器開始時,我將Interface Builder設置爲顯示視圖底部的工具欄。對於導航控制器的第一個視圖控制器,我爲了隱藏工具欄,然後在我的UICollectionViewController使用[self.navigationController setToolbarHidden:YES animated:YES];,我用UICollectionView框與工具欄錯誤

-(void)viewWillAppear:(BOOL)animated 
{ 
    [self.navigationController setToolbarHidden:NO animated:YES]; 
} 

爲了有顯示的工具欄。這部分工作完美,我的問題來自我在UICollectionView中的UICollectionViewCell。我想這是UICollectionView的全尺寸,和我使用的自動版式,所以我使用:

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
    return self.collectionView.frame.size; 
} 

然而,第一次視圖被加載,則返回錯誤的值。第一次視圖和的CollectionView被加載,它返回的CollectionView包括工具欄,然後導致警告的高度尺寸:

項目高度必須小於該UICollectionView 的高度減去部分頂部和底部的值。

並且單元格不加載。但是,當我在警告後強制[self.collectionView reloadData];時,正確的值將返回self.collectionView.frame.size和單元格負載。

我真的非常沮喪,並非常感謝任何人都可以提供的幫助。

編輯: 閱讀曼迪的評論之後,我最終改變我的一些代碼:

-(void)viewWillAppear:(BOOL)animated 
{ 
    [self.navigationController setToolbarHidden:NO animated:YES]; 
    [self.collectionView reloadData]; 
} 

而且問題得到了解決。但是,現在我有一個新的但相關的問題。當我添加[self.collectionView scrollToItemAtIndexPath:selectedIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];(selectedIndexPath從第一個視圖控制器被推送)到viewWillAppear,我得到相同的警告關於UICollectionView項目的大小。如果我有這樣的代碼:

-(void)viewWillAppear:(BOOL)animated 
{ 
    [self.navigationController setToolbarHidden:NO animated:YES]; 
    [self.collectionView scrollToItemAtIndexPath:selectedIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO]; 
    [self.collectionView reloadData]; 
} 

我沒有得到大小警告,但我的CollectionView總是開始於指數0,而不是selectedIndexPath。如果我訂購周圍改成這樣:

-(void)viewWillAppear:(BOOL)animated 
{ 
    [self.navigationController setToolbarHidden:NO animated:YES]; 
    [self.collectionView reloadData]; 
    [self.collectionView scrollToItemAtIndexPath:selectedIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO]; 
} 

我得到的大小警告,細胞不加載,直到我調用調用reloadData方法。但是,它確實從正確的indexPath開始。

回答

1

這個問題實際上是關於處理視圖生命週期。在viewWillAppear所有的子視圖已經佈置好了,所以也許你太晚地隱藏了工具欄。

您在顯示工具欄後調用reloadData的解決方案並不像在視圖出現之前發生的那樣糟糕。這是合乎邏輯的 - 幾何已經改變,你必須重新計算佈局。

嘗試試用視圖控制器的hidesBottomBarWhenPushed屬性。也許這需要處理這個問題而不必編寫任何代碼。

+0

所以,我認爲我解釋得不好,但是你的誤解導致瞭解決方案!當我說「強制reloadData」時,我實際上是在談論調用一個執行'reloadData'的方法。然而,基於你所說的,我添加了'[self.collectionView reloadData];'到' - (void)viewWillAppear',它現在可以很好地工作。非常感謝你。 – Nick

+0

好,我很高興。你應該點擊複選標記。 – Mundi

+0

我會,但現在,它創建了一個不同但相關的問題(請參閱我的編輯) – Nick