将UICollectionView的大小调整为内容大小

时间:2016-10-31 18:56:06

标签: ios uistackview

总结:我在stackview中有一个子视图,并且该子视图是以编程方式调整的。它有几个空视图来填补空白区域。但是,在运行时,尝试调整子项的大小不起作用,它仍然与故事板中的大小相同。如何调整子视图的大小以使堆栈视图符合其新大小并相应地对其进行定位。

详细说明: 我有一个自定义布局的UICollectionView。布局正确计算子视图的位置(它们显示我想要的位置)并返回正确的内容大小。内容大小比屏幕窄,但可能更长,具体取决于方向。

自定义布局返回正确的计算大小,但集合视图不会调整大小。

我尝试以编程方式更改父视图viewDidLoad上的集合视图的大小。没用。

我尝试以编程方式更改父视图viewDidLoad上的集合视图的layoutMargins。没用。

我正在使用Swift 3,XCode 8。

1 个答案:

答案 0 :(得分:13)

如果我理解你的问题,你需要你的UICollectionView的大小等于它的内容,换句话说,你希望你的UICollectionView有一个内在大小(就像一个根据文本自动调整大小的标签)。

在这种情况下,您可以继承UICollectionView 来添加此行为,然后您无需设置其大小。

class IntrinsicSizeCollectionView: UICollectionView {
    // MARK: - lifecycle
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.setup()
    }

    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
        super.init(frame: frame, collectionViewLayout: layout)

        self.setup()
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        if !self.bounds.size.equalTo(self.intrinsicContentSize) {
            self.invalidateIntrinsicContentSize()
        }
    }

    override var intrinsicContentSize: CGSize {
        get {
            let intrinsicContentSize = self.contentSize
            return intrinsicContentSize
        }
    }

    // MARK: - setup
    func setup() {
        self.isScrollEnabled = false
        self.bounces = false
    }
}

ps:在.xib中,不要忘记将IntrinsicSizeCollectionView高度约束设置为占位符约束(选中“在构建时删除”)