Ячейка динамической ширины в UICollectionView - PullRequest
0 голосов
/ 03 декабря 2018

enter image description here

Я пытаюсь реализовать метки с UICollectionView.Но я должен установить ширину с длиной динамических меток.Я пытаюсь убрать пробелы в картинке.Я делюсь некоторым кодом.Я использую перья.

Заранее спасибо.

layoutFCV.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
let filterCV = UICollectionView(frame: self.view.bounds, collectionViewLayout: layoutFCV)

-

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {       
    if collectionView == filterCollectionView {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FilterSelectionCollectionViewCell", for: indexPath) as! FilterSelectionCollectionViewCell
        return CGSize(width: cell.title.frame.width , height: self.filterCollectionView.frame.height)
    }  else {
        return CGSize(width: 10, height: 10)
    }
}

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Сначала убедитесь, что ваши ограничения в файле UICollectionViewCell.xib установлены правильно.Я имею в виду, что при росте UILabel в ячейке должна увеличиваться и сама ячейка.

Вы должны явно установить заголовок, прежде чем получите размер ячейки.Так вот ваш collectionView(collectionView:, layout:, sizeForItemAt:) метод должен быть:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {       
    if collectionView == filterCollectionView {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FilterSelectionCollectionViewCell", for: indexPath) as! FilterSelectionCollectionViewCell
        cell.title.text = "Newest" //this is for the "Newest" cell. Of curse you should set the proper title for each indexPath
        cell.setNeedsLayout()
        cell.layoutIfNeede()
        return CGSize(width: cell.contenView.frame.width , height: cell.contentView.frame.height)
    }  else {
        return CGSize(width: 10, height: 10)
    }
}
0 голосов
/ 03 декабря 2018

Используйте этот код:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let text = "Title"
    let width = self.estimatedFrame(text: text, font: UIFont.systemFont(ofSize: 14)).width
    return CGSize(width: width, height: 50.0)
}

func estimatedFrame(text: String, font: UIFont) -> CGRect {
    let size = CGSize(width: 200, height: 1000) // temporary size
    let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin)
    return NSString(string: text).boundingRect(with: size,
                                               options: options,
                                               attributes: [NSFontAttributeName: font],
                                               context: nil)
}
0 голосов
/ 03 декабря 2018
extension ViewController: UICollectionViewDelegateFlowLayout {
     func collectionView(_ collectionView: UICollectionView, layout      collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
     return "String".size(withAttributes: [
       NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 14)
  ])
  }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...