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

时间:2013-01-24 01:01:00

标签: ios uicollectionview collectionview

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

9 个答案:

答案 0 :(得分:169)

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

答案 1 :(得分:19)

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

示例:

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

答案 2 :(得分:7)

Swift,为最新的iOS工作。

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

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

答案 3 :(得分:1)

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

在故事板中,选择Collection View处的Document Outline,然后在Cell Size中修改Size Inspector

如果是自定义,则应将Cell的大小类型更改为Default。

答案 4 :(得分:1)

在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
        }
    }

我希望有所帮助。谢谢!

答案 5 :(得分:1)

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

在查看我项目中的其他馆藏时,我注意到有问题的馆藏中的“馆藏视图流布局”略有不同。

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

,然后在大小检查器中设置单元格大小估计大小

这帮助我解决了问题。

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

答案 6 :(得分:1)

尝试使用UICollectionViewDelegateFlowLayout方法。在Xcode 11或更高版本中,您需要将Storyboard中的Estimated 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)
}

答案 7 :(得分:0)

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

答案 8 :(得分:0)

使用其默认代表。 。

ret[2][3] = 1;