Это представление, которое я хочу воспроизвести:
Я предполагаю, что это UICollectionView
. Ширина и высота должны динамически рассчитываться на основе содержимого, и это то, с чем я борюсь.
Я создал проект, в котором UICollectionView
ведет себя не так, как я хочу: https://github.com/Jasperav/CollectionViewDynamic/blob/master/UIKitTest/ViewController.swift. Вы можете просто запустить проект и увидеть проблему самостоятельно.
Каждый раз, когда добавляется новый Emoji
, можно вызвать метод reloadData
, а размер UICollectionView
должен быть равен размеру контента но с максимальной шириной.
Вот как это выглядит, когда добавлен 1 смайлик (ужасно):
Это действительно странно, ячейка не центрирована, и я получаю ошибки макета в консоли. Когда добавляются 2 смайлика, я ожидаю, что линия окажется рядом друг с другом, но в конечном итоге они окажутся друг под другом...
Места достаточно, чтобы клетки находились рядом друг с другом.
Что я делаю не так? Я правильно вычисляю размер ячейки, когда проверяю значения в визуальном отладчике. Я думаю, что делаю много ручной работы, чтобы убедиться, что размер UICollectionView
правильный, но я не понимаю его правильно.
Я слишком усложняю вещи? То, что я хочу, выглядит довольно просто для меня. Я впервые делаю что-то с UICollectionView
.
Вот так выглядит метод addEmoji
, весь код можно увидеть по ссылке, которую я упомянул выше:
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
Ключевая идея — не обновлять heightAnchor_.constant
в функции addEmoji
, а использовать contentSizeObservation
(идею contentSizeObservation
я взял из здесь).
вы можете искать что-то вроде этого stackoverflow.com/questions/22539979/…