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

时间:2014-10-21 15:30:56

标签: ios xcode uistoryboard

我试图在UICollectionViewCells中创建自适应/适应性UIStoryboard时发现摩擦。

我看到的问题是,您似乎无法设置每Cell Size Size Class,而我正在尝试确定正确的方法这个。我设计了单元格以适应其容器,因此无论大小等级如何,都应自动调整大小。这主要是因为如果我改变大小类,选择我的单元格视图并执行Update Frames然后它们都会调整大小以适应它们的新大小。然而,如果我回到任意/任何规模的课程,我仍然会看到调整大小的版本,这是一次性的交易。

以下我知道我可以尝试:

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

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

4 个答案:

答案 0 :(得分:15)

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

这仍然不是理想的,因为您无法看到故事板中的更改,您无法创建通用设计并在每个不同的设计中看到它格式。

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

答案 1 :(得分:7)

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

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

override func collectionView(collectionView: UICollectionView,
    cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
调用

(未在示例代码中显示),它允许我更新单元格的大小并更新单元格的故事板样式。所以在故事板中并没有完全完成,但在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())
    }
}

答案 2 :(得分:1)

在实施尺寸等级(iPad和iPhone)后,我遇到了同样的问题。好吧,我找到了解决方案。希望它有所帮助!

实施UICollectionViewDelegateFlowLayout。

 public function __construct()
 {
    parent::__construct(); 
 }


      public function updateDb()
      {
             $column = $this->input->post('column');
             $editval = $this->input->post('editval');
             $id = $this->input->post('id');

             $this->load->model('user_m');                     
             $this->user_m->inline( $column, $editval, $id );

             return;
      }

答案 3 :(得分:0)

快捷键4
各位资深开发人员,

如果UICollectionViewCell的高度和宽度相同,这很容易做到。

enter image description here

步骤
1.导入** UICollectionViewDelegateFlowLayout **
2.添加UICOllectionView的 sizeForItem IndexPath 方法,如下所示

func collectionView(_ collectionView : UICollectionView,layout collectionViewLayout:UICollectionViewLayout,sizeForItemAt indexPath:IndexPath) -> CGSize {
    return CGSize(width: collectionVw.frame.size.height, height: collectionVw.frame.size.height)
}   

注意:发生的事情是您将UICollectionView的高度设置为UICollectionViewCell的高度和宽度

快乐编码:)