如何为每个大小类配置UICollectionView单元格大小?

Tri*_*ith 21 xcode ios uistoryboard

试图创建响应/自适应当我发现摩擦UICollectionViewCellsUIStoryboard.

我看到的问题是你似乎无法设置Cell Size每个人,Size Class而我正在努力确定正确的方法.我设计了细胞以适应它们的容器,因此无论大小等级如何,它们都应该自动调整大小.这主要是因为如果我改变大小类,选择我的单元格视图Update Frames然后他们都调整大小以适应他们的新大小.然而,这是一次性的交易,如果我回到任何/任何规模的类,那么我仍然看到调整大小的版本.

这是我知道我可以尝试的:

  • 创建多个单元格,具有固定尺寸,每个尺寸类别一个,并在Storyboard视图中.然后我只能在运行时使用正确的那个,但我可以在设计时看到它们.
  • 可以创建一个Per Size类的集合视图,每个类都只为该大小安装.这可行,但管理倍数会很痛苦UICollectionViews
  • 以编程方式创建我的界面和/或约束(失去设计的可见性).

我希望这是一个解决方案,我只是遗漏了一些东西,但我知道可能是IB工具在这一点上与代码不匹配.

Tri*_*ith 15

我想出的解决方案就是实现UICollectionViewDelegateFlowLayout并实现该sizeForItemAtIndexPath方法.这意味着可以将单元格尺寸设置为与可用Size Class尺寸匹配.

这仍然不理想,因为您无法看到故事板中的更改,并且您无法创建通用设计并以每种不同的格式查看它.

我仍然希望有人有更好的选择.

  • 我感受到你的痛苦,此刻也遇到了同样的问题.更糟糕的是,由于某种原因,正在运行的应用程序没有为单元格采取正确的特性,当我对w任何,h any和w regular,h regular的不同约束时 - 仅在我向常规/添加虚拟视图之后常规大小类它使用那些特征而不是任何/任何特征.大小类仍然需要Apple的关注似乎...... (3认同)

Mar*_*lme 7

这是一个在Swift中编码的类似解决方案.我只是在故事板中设置了我的两个单元格,并让它们可以查看任何大小类组合.当特征集合改变时,我更新了我想要使用的cellSize和cellReuseID,并告诉collectionView重新加载所有可见的单元格.然后

collectionView(collectionView: UICollectionView,
    layout collectionViewLayout: UICollectionViewLayout,
    sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
Run Code Online (Sandbox Code Playgroud)

override func collectionView(collectionView: UICollectionView,
    cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
Run Code Online (Sandbox Code Playgroud)

(调用示例代码中未显示)可以让我更新单元格的大小并更新单元格的故事板样式.所以在故事板中并没有完全完成,但在Xcode中提供更多支持之前已经足够了.

struct MyCollectionViewConstants{
    static let CELL_ANY_ANY_REUSE_ID = "cell";
    static let CELL_COMPACT_REGULAR_REUSE_ID = "cellSmall"
    static let CELL_ANY_ANY_SIZE = 100;
    static let CELL_COMPACT_REGULAR_SIZE = 70;
}

class MyCollectionView: UICollectionViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    var cellSize = MyCollectionViewConstants.CELL_ANY_ANY_SIZE
    var cellReuseID = MyCollectionViewConstants.CELL_ANY_ANY_REUSE_ID


    func collectionView(collectionView: UICollectionView,
        layout collectionViewLayout: UICollectionViewLayout,
        sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize{

        return CGSize(width: cellSize, height: cellSize)
    }

    override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)

        if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.Compact
            && self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClass.Regular){
            cellSize = MyCollectionViewConstants.CELL_COMPACT_REGULAR_SIZE
            cellReuseID = MyCollectionViewConstants.CELL_COMPACT_REGULAR_REUSE_ID
        } else {
            cellSize = MyCollectionViewConstants.CELL_ANY_ANY_SIZE
            cellReuseID = MyCollectionViewConstants.CELL_ANY_ANY_REUSE_ID
        }

        self.collectionView.reloadItemsAtIndexPaths(
            self.collectionView.indexPathsForVisibleItems())
    }
}
Run Code Online (Sandbox Code Playgroud)