Вот фрагмент , который измеряет размер строки. (Вам, вероятно, придется изменить значение по умолчанию 220 на то, что соответствует вашим потребностям.)
extension String {
func size(width:CGFloat = 220.0, font: UIFont = UIFont.systemFont(ofSize: 17.0, weight: .regular)) -> CGSize {
let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.byWordWrapping
label.font = font
label.text = self
label.sizeToFit()
return CGSize(width: label.frame.width, height: label.frame.height)
}
}
В вашем collectionViewController убедитесь, что вы унаследовали UICollectionViewDelegateFlowLayout
в контроллере представления:
class yourViewController : UICollectionViewController, UICollectionViewDelegateFlowLayout
Затем реализуйте функцию sizeForItemAt:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let yourString = yourStringArray[indexPath.row]
let padding = CGSize.init(width: 20, height: 20)
let textSize = yourString.size(width: collectionView.frame.width) // you can also specify a font with fontSize and weight. Default is set to the system font with fontSize 17.
return CGSize.init(width: textSize.width + (padding.width / 2), height: textSize.height + (padding.height / 2))
}
Примечание. Я добавил произвольные отступы к вашей ячейке 10 со всех сторон, поэтому вам, вероятно, потребуется добавить отступы в зависимости от того, что вы хотите, чтобы ваша ячейка выглядеть. «size» измеряет только размер этикетки на основе ее текста.