如何将UIView约束到UICollectionViewCell

时间:2016-11-21 15:12:47

标签: ios swift uicollectionview swift3 uicollectionviewcell

与其他人似乎都在问的相反。我有一个带有单元格的collectionView,我在其中添加了一个加载的.xib作为子视图。很容易。

但是,collectionView单元格的大小会根据不同的条件在运行时更改,因此我需要将子视图正确约束到collectionViewCell的contentView的大小。为了做到这一点,我在添加子视图时有了这段代码:

/**
Used to present a view in the collectionView. WidetView is a subclass of UIView
*/
class WidgetCell: UICollectionViewCell, Reusable {
    var widgetView: WidgetView! {
        didSet {
            for view in contentView.subviews {
                view.removeFromSuperview()
            }

            contentView.addSubview(widgetView)
            let views = ["view": widgetView as Any]
            var constraints = NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[view]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: views)
            constraints.append(contentsOf: NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[view]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: views))

            contentView.addConstraints(constraints)
        }
    }
}

不幸的是,所呈现的不是一组受到适当约束的视图。添加的UIView与.xib中定义的大小相同。

unsized cells

我该如何解决这个问题?如果你想要一个示例项目(Swift 3),请看这里:https://github.com/AaronBratcher/FitToCell

2 个答案:

答案 0 :(得分:0)

使用现有代码调用contentView.activateConstraints(constraints)然后在显示单元格的位置cell.layoutIfNeeded(),这是一个简单的例子。这会强制单元格重新计算其子视图的边界。

答案 1 :(得分:0)

由于单元格的预期大小已知用于布局目的,请将该大小传递给WidgetCell实例,然后设置视图的帧大小。

final class WidgetCell: UICollectionViewCell {
    var cellSize: CGSize?
    var widgetView: WidgetView! {
        didSet {
            for view in contentView.subviews {
                view.removeFromSuperview()
            }

            let frame: CGRect
            if let cellSize = cellSize {
                frame = CGRect(origin: CGPoint(x: 0, y: 0), size: cellSize)
            } else {
                frame = contentView.frame
            }

            widgetView.frame = frame
            widgetView.setNeedsLayout()
            contentView.addSubview(widgetView)
        }
    }
}