Ячейка Dynami c CollectionView в нормальной ячейке CollectionView - PullRequest
0 голосов
/ 03 мая 2020

Я использую раскадровку с CollectionView внутри ячейки CollectionView. Мне нужен тот, который внутри, чтобы изменить высоту на основе текста, указанного в массиве, и подключить его к моей UILabel.

Я отправил ответ, не стесняйтесь использовать его!

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Вот фрагмент , который измеряет размер строки. (Вам, вероятно, придется изменить значение по умолчанию 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» измеряет только размер этикетки на основе ее текста.

0 голосов
/ 05 мая 2020

Это просто то, что я искал ... но любой может использовать его с вашей коллекцией раскадровок ViewView.

Где находится ваш collectionView:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var CV: UICollectionView!

     let screenSize: CGRect = UIScreen.main.bounds

    var array = ["Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Dignissim enim sit amet venenatis urna cursus eget nunc. Congue nisi vitae suscipit tellus mauris a diam maecenas sed. Ac tortor vitae purus faucibus ornare suspendisse sed nisi lacus. Arcu risus quis varius quam quisque. Sit amet consectetur adipiscing elit pellentesque. Tellus cras adipiscing enim eu. Eros in cursus turpis massa tincidunt. Non diam phasellus vestibulum lorem sed risus ultricies tristique. Enim nunc faucibus a pellentesque sit amet. Aliquet nec ullamcorper sit amet. Turpis massa tincidunt dui ut. Iaculis urna id volutpat lacus laoreet non curabitur. Congue mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Commodo ullamcorper a lacus vestibulum sed arcu non odio. Quis auctor elit sed vulputate. Molestie nunc non blandit massa enim nec. Tempus imperdiet nulla malesuada pellentesque elit eget gravida cum sociis. Facilisis volutpat est velit egestas dui id ornare arcu. Sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus."]

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        CV.delegate = self
        CV.dataSource = self
    }
}

extension ViewController : UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        array.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = CV.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! Cell
        cell.TextPosted.text = array[indexPath.item]
        //cell.layoutIfNeeded()
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: screenSize.width, height: 175)
    }
}

А теперь ваш ярлык:

import UIKit

class Cell: UICollectionViewCell {

    @IBOutlet weak var TextPosted: UILabel!

        override func awakeFromNib() {
            let screenSize: CGRect = UIScreen.main.bounds
            contentView.widthAnchor.constraint(equalToConstant: screenSize.width).isActive = true
            contentView.heightAnchor.constraint(greaterThanOrEqualToConstant: 175).isActive = true

            TextPosted.numberOfLines = 0
            TextPosted.translatesAutoresizingMaskIntoConstraints = false
            TextPosted.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true
            //Left Side
            TextPosted.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
            //Right Side
            TextPosted.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
            //Bottom Space between contentView and text
            TextPosted.bottomAnchor.constraint(lessThanOrEqualTo: contentView.bottomAnchor, constant: -10).isActive = true
    }
}
...