2

我在靜態表格視圖單元格內使用集合視圖,我使用自動佈局來定義集合視圖的框架。另外,我使用FlowLayout作爲collectionViewLayout。UICollectionView內容沒有正確調整大小

問題:

  • 的行爲就像預期的iPhone 4S和5的屏幕。 (寬度相同)
  • 一旦寬度發生變化(iPhone 6和6 Plus),集合視圖會正確調整大小,但內容會保持其大小。
  • 這對於單元格和部分都會發生。

額外的信息:

  • 我設置collectionViewLayout minimumInteritemSpacingForSectionAtIndex爲零。

  • 細胞的寬度如果我配置的佈局總是被設置爲tableView.frame.size.width/2

  • CGFloat headerHeight = 52; 
    
    collectionViewLayout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0); 
    collectionViewLayout.headerReferenceSize = CGSizeMake(self.width, headerHeight); 
    
  • 這是它現在看起來。綠色部分代表UICollectionView。黑色和藍色的細胞。分界線應該調整大小,單元格應該分成2列。

+0

你是否對自定義集合視圖單元格中的子視圖應用了約束? –

+0

你在哪裏設置單元格的寬度?你使用collectionViewFlowLayout委託方法或其他東西? –

+0

@NileshMahajan是的。對於單元格和部分(這是一個自定義可重用的視圖) – vyudi

回答

3

從代碼你發佈,你只是設置標題的大小,但我想你也有類似

collectionViewLayout.itemSize = CGSizeMake(self.collectionView.frame.width/2, height); 

的重要組成部分,是在該方法中配置這一點,因爲如果你在viewDidLoad中做到這一點的看法是不正確layouted卻又如此的寬度也只是在故事板的一組,無論在哪個設備你運行你的應用程序。

的解決辦法是將上面的代碼中viewWillLayoutSubviews

- (void)viewWillLayoutSubviews { 
    [super viewWillLayoutSubviews]; 
    collectionViewLayout.itemSize = CGSizeMake(self.collectionView.frame.width/2, height); 
    collectionViewLayout.headerReferenceSize = CGSizeMake(self.collectionView.frame.width/2, height); 
} 

另一種方式是實現的FlowLayout委託方法:

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
    return cCGSizeMake(collectionView.frame.width/2, CUSTOM_HEIGHT); 
} 

// The same for the header 
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { 
    return cCGSizeMake(collectionView.frame.width/2, CUSTOM_HEIGHT); 
} 

請務必設置委託的collectionView

讓我知道它是怎麼回事:)

更新

對於細胞,添加這些方法太:

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { 
    return CGRectZero; 
} 

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section { 
    return 0; 
} 

對於sectionHeader,也許你需要檢查你有沒有約束,對於分離器例如。

+0

感謝您的幫助Catalina。不幸的是,內容保持原來的大小。我已經嘗試了你推薦的兩種方法。我會張貼一張圖片來更好地解釋。 :) – vyudi

+0

是否調用委託方法?你可以在那裏添加一個'NSLog'來打印'collectionView'框架,只是爲了檢查它是否是正確的 –

+0

它們被調用並且返回值是正確的。 :/ – vyudi

0

一定要使用所有用於精確造型如下:

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView; 
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section; 
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath; 
-(UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section; 
-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section; 
-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section; 
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath; 
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath; 

更改單元格內容的大小,使用:

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return CGSizeMake((kScreenWidth/2-8), 44); // Use your own X and Y sizes 
} 
+0

感謝您的關注。但這不是我的答案。內容保持原始大小。另外,我已經在實施單元格內容大小。 – vyudi