UICollectionView 内容未正确调整大小
UICollectionView content not resizing properly
我在静态 table 视图单元格内使用集合视图,并使用自动布局来定义集合视图的框架。另外,我使用 FlowLayout 作为 collectionViewLayout。
问题:
- 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。黑色和蓝色的细胞。分割线应该调整大小,单元格应该分成两列。
请务必使用以下所有内容来精确设置样式:
-(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
}
根据您发布的代码,您只是在设置 header 的大小,但我想您也有类似
的内容
collectionViewLayout.itemSize = CGSizeMake(self.collectionView.frame.width/2, height);
重要的部分是你用哪种方法配置它,因为如果你在 viewDidLoad 中这样做,视图布局还不正确,所以宽度将只是情节提要中设置的宽度,无论你在哪个设备上 运行 你的应用程序。
解决方案是将上面的代码放在 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
设置委托
让我知道进展如何:)
Update
对于单元格,也添加这些方法:
- (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
,也许您需要检查那里的约束条件,例如分隔符。
我在静态 table 视图单元格内使用集合视图,并使用自动布局来定义集合视图的框架。另外,我使用 FlowLayout 作为 collectionViewLayout。
问题:
- 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。黑色和蓝色的细胞。分割线应该调整大小,单元格应该分成两列。
请务必使用以下所有内容来精确设置样式:
-(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
}
根据您发布的代码,您只是在设置 header 的大小,但我想您也有类似
的内容collectionViewLayout.itemSize = CGSizeMake(self.collectionView.frame.width/2, height);
重要的部分是你用哪种方法配置它,因为如果你在 viewDidLoad 中这样做,视图布局还不正确,所以宽度将只是情节提要中设置的宽度,无论你在哪个设备上 运行 你的应用程序。
解决方案是将上面的代码放在 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
让我知道进展如何:)
Update
对于单元格,也添加这些方法:
- (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
,也许您需要检查那里的约束条件,例如分隔符。