iOS UICollectionView 原型单元格大小属性被忽略

Posted

技术标签:

【中文标题】iOS UICollectionView 原型单元格大小属性被忽略【英文标题】:iOS UICollectionView prototype cell size property ignored 【发布时间】:2013-01-07 16:02:36 【问题描述】:

我正在使用带有两个原型单元格的 UICollectionView。原型单元格具有不同的宽度并包含不同的控件(图像视图和 Web 视图)。我肯定会为给定索引返回正确的原型单元格(所有单元格都显示正确的内容),但原型单元格大小被忽略,而是使用集合视图的项目大小。这不像我手动设置大小。如果属性在实际显示时被忽略,那么允许原型单元格在情节提要中调整大小有什么意义?

【问题讨论】:

【参考方案1】:

故事板编辑器中单元格的大小只是为了帮助您设计单元格。由于每个原型单元格的大小可能不同,因此 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)
    

【讨论】:

我使用自定义 drawrect 在我的 uicollectionview 单元格中添加渐变层、uilabel 和 uiimage,但在我的 uicollection 视图中绘制的尺寸不正确。将此代码放在我的主视图控制器中解决了问题。 如果所有单元格的大小都相同,指定大小的更有效方法是在UICollectionViewFlowLayout 中设置它。例如flow.itemSize = CGSizeMake(50,100); 但是有什么方法可以通过-collectionView:layout:sizeForItemAtIndexPath: 方法以编程方式访问原型单元格? (使用重用标识符将单元格出列是行不通的,因为这最终会调用调整大小的方法,从而导致无限循环。) 为了进一步混淆,通过拖动其调整大小手柄来调整情节提要中原型单元格的大小有时会更改控制器的Cell Size,而手动输入原型的大小不会。【参考方案2】:

如果所有单元格大小相同,您可以在UICollectionViewFlowLayout上设置itemSize

例子:

((UICollectionViewFlowLayout *) self.collectionViewLayout).itemSize = CGSizeMake(100, 100);

【讨论】:

似乎 collectionViewLayout.itemSize 在 ios6 中不可用 它在 UICollectionViewLayout 的默认实现中可用 - 即 - UICollectionViewFlowLayout (如答案所述)。只需铸造和使用。 (collectionViewLayout as?UICollectionViewFlowLayout)?.itemSize【参考方案3】:

Swift,适用于最新的 iOS。

(collectionView.collectionViewLayout as! UICollectionViewFlowLayout).itemSize = cellSize

我没有足够的积分来回复Sam,但关键是不是UICollectionViewLayout而是UICollectionViewFlowLayout。

【讨论】:

【参考方案4】:

我有一个类似的问题,我在 sizeForItemAt 上设置了一个断点,并且我的集合中的每个单元格都会调用它,但是,代码中设置的大小从未反映在设备上。

在查看我项目中的其他集合时,我注意到存在问题的集合中的集合视图流布局略有不同。

通过在情节提要中选择流布局

然后在 Size Inspector 中设置 Cell Size & Estimate Size

这帮助我解决了我的问题。

但是,单元格的大小不会随 sizeForItemAt 中的内容动态变化

【讨论】:

在我的例子中,Estimate Size 设置为 Automatic,设置为 None 也很重要。【参考方案5】:

您可以在UICollectionView 属性中设置UICollectionViewCell 的大小。

在情节提要中,在Document Outline 中选择Collection View,然后在Size Inspector 中编辑您的Cell Size

如果是自定义,您应该将单元格的大小类型更改为默认。

【讨论】:

【参考方案6】:

在 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
        
    

我希望这会有所帮助。谢谢!

【讨论】:

【参考方案7】:

尝试使用 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)

【讨论】:

【参考方案8】:

如果您的所有单元格大小相同,您只需将UICollectionView 的单元格大小属性设置为与UICollectionViewCell 的大小属性相同。

【讨论】:

【参考方案9】:

使用其默认委托。 . .

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath

    CGSize mElementSize;
    mElementSize = CGSizeMake(SCREEN_WIDTH , SCREEN_HEIGHT *0.60);
    return mElementSize;
   

【讨论】:

以上是关于iOS UICollectionView 原型单元格大小属性被忽略的主要内容,如果未能解决你的问题,请参考以下文章

IOS:通过长按选择 UICollectionView 单元格

UICollectionView 自调整大小的单元格

根据文本调整单元格宽度 - UICollectionView - iOS

ios中的UICollectionView单元格滚动问题

如何在 iOS 中动态更改 UICollectionView 单元格高度

将平移手势添加到 UICollectionView 单元 - IOS/Swift