普通CollectionView单元格中的动态CollectionView单元格

时间:2020-05-02 22:40:39

标签: ios swift uicollectionview uicollectionviewcell autoresize

我正在将故事板与CollectionView单元内的CollectionView一起使用。我需要一个里面的东西,以根据数组中给出的文本调整高度并将其连接到我的UILabel。

我发布了答案,随时使用!

2 个答案:

答案 0 :(得分:1)

这里是一个snippet,用于测量字符串的大小。 (您可能需要将默认值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的单元格中添加了任意填充,因此您可能需要根据您希望单元格的外观来添加填充。 “大小”仅根据标签的文本来衡量标签的大小。

答案 1 :(得分:0)

这只是我在寻找的东西...但是任何人都可以在您的故事板collectionView中随意使用它。

您的collectionView在以下位置:

            double[] a = { 1.23, 2.34, 5.45 };
            IntPtr aptr = Marshal.AllocHGlobal(a.Length * sizeof(double));
            Marshal.Copy(a, 0, aptr, a.Length);
            double[] b = { 1.23, 2.34, 5.45 };
            IntPtr bptr = Marshal.AllocHGlobal(b.Length * sizeof(double));
            Marshal.Copy(b, 0, bptr, b.Length);

            xyz(aptr, bptr)

现在是您的标签:

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)
    }
}