我正在使用带有两个原型单元的 UICollectionView。原型单元格具有不同的宽度并包含不同的控件(图像视图和 Web 视图)。我肯定会为给定索引返回正确的原型单元格(所有单元格都显示正确的内容),但原型单元格大小被忽略,而是使用集合视图的项目大小。这不像我手动设置大小。如果属性在实际显示时被忽略,那么允许原型单元格在情节提要中调整大小有什么意义?
9 回答
故事板编辑器中单元格的大小只是为了帮助您设计单元格。由于每个原型单元格的大小可能不同,因此 UICollectionView 不知道为所有单元格选择哪个单元格的大小。这就是为什么您要单独设置要用于单元格的实际大小。您可以在设计器中通过选择集合视图并在“集合视图大小”标题下的大小检查器中设置其单元格大小宽度和高度来完成此操作。
或者,您可以覆盖以下方法并返回一个 CGSize 对象,该对象指定要用于每个单元格的大小。使用这种方法,您实际上可以让每个单元格具有不同的大小:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
例子:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return CGSizeMake(100, 100);
}
您的视图控制器需要是 UICollectionViewDelegateFlowLayout 的委托才能调用此方法。所以不要忘记将该委托声明添加到视图控制器的 .h 文件中,例如:
@interface MyViewController () <UICollectionViewDelegateFlowLayout>
迅速
extension MyViewController : UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 100, height: 100)
}
}
如果所有单元格的大小相同,您可以itemSize
在UICollectionViewFlowLayout
例子:
((UICollectionViewFlowLayout *) self.collectionViewLayout).itemSize = CGSizeMake(100, 100);
Swift,适用于最新的 iOS。
(collectionView.collectionViewLayout as! UICollectionViewFlowLayout).itemSize = cellSize
我没有足够的积分来回复 Sam,但关键是它不是 UICollectionViewLayout 而是 UICollectionViewFlowLayout。
UICollectionViewCell
您可以在UICollectionView
属性中设置大小。
在情节提要中,选择Collection View
,Document Outline
然后编辑您Cell Size
的Size Inspector
。
如果是自定义,您应该将单元格的大小类型更改为默认值。
在 Swift 中,您可以调用 sizeForItemAtIndexPath 委托方法来设置每个单元格的大小。
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
if indexPath.row == 0 {
// Set the size for cell no. 0
}else if indexPath.row == 1 {
// Set the size for cell no. 1
}
}
我希望这会有所帮助。谢谢!
尝试使用 UICollectionViewDelegateFlowLayout 方法。在 Xcode 11 或更高版本中,您需要在 Storyboard 中将 Estimate Size 设置为 none。
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout:
UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let padding: CGFloat = 170
let collectionViewSize = advertCollectionView.frame.size.width - padding
return CGSize(width: collectionViewSize/2, height: collectionViewSize/2)
}
如果所有单元格的大小相同,则只需将UICollectionView
的单元格大小属性设置为与UICollectionViewCell
的大小属性相同。
使用其默认委托。. .
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
CGSize mElementSize;
mElementSize = CGSizeMake(SCREEN_WIDTH , SCREEN_HEIGHT *0.60);
return mElementSize;
}