У меня есть коллекционное представление с ячейками динамической высоты (на основе, возможно, многострочной метки и текстового представления внутри), которое идеально адаптируется по высоте, когда я разбиваю его на несколько строк. Однако, когда текст представляет собой всего одно слово или не охватывает всю ширину экрана, ячейка становится настолько широкой, насколько это необходимо, в результате чего ячейки располагаются рядом друг с другом, а не под друг другом.
Посмотрите на результат с различной длиной текста внутри textview.
Тем не менее, я хочу, чтобы ячейки находились друг под другом, как в Instagram или Twitter. Очевидно, мне нужно установить ограничение ширины для ячейки, чтобы оно равнялось всей ширине экрана, но я не могу найти, как это сделать.
Я использую FlowLayout с предполагаемым размером элемента в моем AppDelegate:
let layout = UICollectionViewFlowLayout()
window?.rootViewController = UINavigationController(rootViewController: HomeController(collectionViewLayout: layout))
layout.estimatedItemSize = CGSize(width: 414, height: 150)
Я также установил ограничения для collectionView в viewDidLoad, поэтому collectionView принимает всю ширину и высоту экрана:
collectionView?.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
collectionView?.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
collectionView?.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true
collectionView?.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
Мои ограничения для метки и вида текста выглядят так, что позволяет ширине принимать требуемый размер (поэтому он не фиксирован):
// vertical constraints usernameLabel & commentTextView
addConstraintsWithFormat(format: "V:|-16-[v0]-2-[v1]-16-|", views: usernameLabel, commentTextView)
// horizontal constraints usernameLabel
addConstraintsWithFormat(format: "H:|-16-[v0]-16-|", views: usernameLabel)
// horizontal constraints commentTextView
addConstraintsWithFormat(format: "H:|-16-[v0]-16-|", views: commentTextView)
Все это, по моему мнению, необходимо для этой работы. Тем не менее, мне кажется, что я еще не установил ограничение ширины, чтобы сделать эту работу. Я попытался добавить widthAnchor на collectionView (равно view.widthAnchor), это не сработало:
collectionView?.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive = true
Я также попытался установить ширину в методе sizeForItemAt, но это также не сработало:
return CGSize(width: view.frame.width, height: 100)
Теперь я проверяю ширину, чтобы увидеть, где она идет не так, но я получаю результат, который мне нужен, я думаю:
print("collectionView width: ", collectionView?.frame.size.width)
print("collectionView height: ", collectionView?.frame.size.height)
print("screen width: ", UIScreen.main.bounds.width)
print("screen height: ", UIScreen.main.bounds.height)
Результаты:
collectionView width: Optional(414.0)
collectionView height: Optional(736.0)
screen width: 414.0
screen height: 736.0
У меня нет идей о том, как двигаться вперед. Все статьи или посты, которые я прочитал, связаны с этой проблемой, либо явно рассчитывают высоту, либо используют два решения, которые я упомянул выше.
Есть идеи, что я делаю не так?