动态 UICollectionView -> 错误和视觉布局问题

Dynamic UICollectionView -> errors and visual layout problems

这是我要复制的视图:

我假设它是 UICollectionView。宽度和高度应该根据内容动态计算,这是我纠结的一点。

我创建了一个项目,其中 UICollectionView 的行为与我想要的不一样:https://github.com/Jasperav/CollectionViewDynamic/blob/master/UIKitTest/ViewController.swift。您可以直接 运行 项目然后自己查看问题。

每次添加新的Emoji,都可以调用reloadData方法,UICollectionView的大小应该等于内容的大小但是有一个最大宽度。 这是添加 1 个表情符号时的样子(可怕):

真的很奇怪,单元格没有居中,我在控制台中出现布局错误。当添加 2 个表情符号时,我希望排成一行,但它们最终会排在彼此下面...

有足够的 space 单元格可以并排放置。 我究竟做错了什么?当我检查可视化调试器中的值时,我正确地计算了单元格的大小。我想我正在做很多手动工作来确保 UICollectionView 尺寸正确,但我没有做对。

我是不是把东西复杂化了?我想要的东西对我来说看起来很基本。不过,这是我第一次使用 UICollectionView 做一些事情。

这是addEmoji方法的样子,整个代码可以在我上面提到的link中看到:

func addEmoji(emoji: Emoji) {
    emojis.append(emoji)

    var width: CGFloat = 0

    for emoji in emojis {
        width += emoji.size().width
    }

    let finalWidth = min(width, 280)

    // Add some breath
    widthAnchor_.constant = finalWidth + 5

    reloadData()

    heightAnchor_.constant = collectionViewLayout.collectionViewContentSize.height
}

我对你的代码做了一些小的改动,现在一切正常(改动用评论标记 // NEW): https://gist.github.com/sa1dai/b50bec10438b439a8c74cc6e8071bcf4?ts=4

关键思想不是在addEmoji函数中更新heightAnchor_.constant,而是使用contentSizeObservation(我从中获取了contentSizeObservation的思想) .