仅将sizeForItemAt应用于一个collectionView

时间:2019-06-06 16:08:53

标签: swift uicollectionview uicollectionviewcell

我正在使用sizeForItemAt设置一个视图控制器的单元格大小,但是似乎我还必须为其他CollectionViews返回一个结果,问题是我没有其他视图的大小值,因为它在情节提要中定义。我正在尝试:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    if categorie_cv == collectionView {
        let size: CGSize = categorie[indexPath.row].size(withAttributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 17.0)])
        return CGSize(width: size.width + 40.0, height: categorie_cv.bounds.size.height)
    } else if collectionView == risultati {

        return THIS VALUE IS SET IN THE STORYBOARD 
    } else {
        return THIS VALUE IS SET IN THE STORYBOARD
    }
}

1 个答案:

答案 0 :(得分:0)

否,很遗憾,您不能告诉它自动使用从其布局派生的元素的固有大小。

但是,如果您的布局确实允许通过AutoLayout /它的内容明确配置内部尺寸,则可以调用UIView.intrinsicContentSize,也可以与layoutIfNeeded调用混合使用。我不能肯定这种解决方案能否100%有效。

如果我是您,我将不寻求分配代表和实现sizeForItemAt的方法,而是在单元格本身的问题上也定义此大小。

顺便说一句,实际上,要让单元格确定其内容大小是“有点不符合您的预期”。这对于UITableView可能非常有用且合乎逻辑,但是对于UICollectionView而言,布局计算最好由更简单的计算方法来确定。

也就是说,将宽度计算为collectionView的边界宽度的一半并等于高度是很便宜的-而是让内容使用非常动态的内容压缩规则和约束优先级评估自由地布局自己。通常,在所有单元格的长宽比方面绝对没有任何共同点,宽度或高度实际上会倾向于输出不良结果。