Я работал с пользовательским UICollectionViewFlowLayout
, чтобы настроить промежутки между ячейками, чтобы я мог получить хороший поток в моем collectionView
.Но с моим текущим кодом я не могу понять, как я могу регулировать размеры ячеек, не нарушая счетчик строк.Это заставляет некоторые клетки думать, что они могут поместиться в строку, но они не могут.
Мой пользовательский поток
class UserProfileTagsFlowLayout: UICollectionViewFlowLayout {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let attributesForElementsInRect = super.layoutAttributesForElements(in: rect)
var newAttributesForElementsInRect = [UICollectionViewLayoutAttributes]()
var leftMargin: CGFloat = 0.0;
for attributes in attributesForElementsInRect! {
if (attributes.frame.origin.x == self.sectionInset.left) {
leftMargin = self.sectionInset.left
} else {
var newLeftAlignedFrame = attributes.frame
newLeftAlignedFrame.origin.x = leftMargin
attributes.frame = newLeftAlignedFrame
}
leftMargin += attributes.frame.size.width + 8 // Makes the space between cells
newAttributesForElementsInRect.append(attributes)
}
return newAttributesForElementsInRect
}
}
Так что в моем ViewController
я расширил
extension myViewController: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let tag = tagsArray[indexPath.row]
let font = UIFont(name: "Raleway", size: 14)!
let size = tag.value.size(withAttributes: [NSAttributedString.Key.font: font])
let dynamicCellWidth = size.width
/*
The "+ 20" gives me the padding inside the cell
*/
return CGSize(width: dynamicCellWidth + 20, height: 35)
}
// Space between rows
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 5
}
// Space between cells
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 10
}
}
Когда я пробую этот код, я получаю результат в разделе результатов на iPhone X. Вы можете увидеть, что тег «Машинное обучение» спрыгивает вниз на новую строку, потому что он думает, что он может соответствовать строкевыше.Если я уберу «заполнение» для ячейки в функции sizeForItem
, у меня не возникнет этой проблемы.Но это выглядит просто ужасно.
Итак, мой вопрос: Как я могу использовать заполнение для своих ячеек, не нарушая flowLayout?
Пока мой текущий результат выглядит так:
iPhone X: