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

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

【问题讨论】:

    标签: ios uicollectionview collectionview


    【解决方案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;
              }   
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-03-19
                • 2014-07-08
                • 1970-01-01
                • 2017-01-24
                • 2021-02-16
                • 2015-02-26
                相关资源
                最近更新 更多