繁体   English   中英

使用 UICollectionView 为单元格加载不同的高度

[英]Loading different heights for cell with UICollectionView

我正在尝试根据标签的内容动态调整 CollectionView 中的单元格。 基本上我已经找到了方法,但我的挑战是

cellForItemAt方法

之前先被调用

heightForCellAtIndexPath方法

这样做意味着我们试图在加载数据之前获取高度,因此单元格将始终具有相同的高度,因此我们不会获得不同高度的单元格

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let content_ = content[indexPath.row]
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "NotesUI", for: indexPath) as! NotesUI
            cell.setData(data: content_)
            return cell
    }


 func collectionView(_ collectionView: UICollectionView, heightForCellAtIndexPath indexPath:IndexPath) -> CGFloat {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "NotesUI", for: indexPath) as! NotesUI
    return cell.allNoteViews()[indexPath.item - 1].bounds.size.height
  }

本质上在 NotesUI CollectionView 类中:

class NotesUI:UICollectionViewCell{
    @IBOutlet var note: UILabel!
    var views: [UILabel] = []
    
    func setData(data: NoteModel){
       note.text = data.note
       note.numberOfLines = 0
       note.lineBreakMode = NSLineBreakMode.byWordWrapping
       note.sizeToFit()
     
       views.append(note)
    }
    
     func allNoteViews()->[UILabel]{
        return views
    }
}

我想我的问题归结为如何在cellForItemAt方法之后调用heightForCellAtIndexPath方法,以便 CollectionView 在有内容后获取标签的高度

如果使用自动布局,则不需要计算每个单元格的高度。 您可以向单元格添加垂直堆栈视图并为其添加标签。

这是一个自定大小集合视图单元格的基本示例。

class YourCustomCell: UICollectionViewCell {
    
    // Add your labels to this stackView
    @IBOutlet weak var yourLabelContainer: UIStackView!
        
    override func awakeFromNib() {
        super.awakeFromNib()
        
        yourLabelContainer.translatesAutoresizingMaskIntoConstraints = false
        yourLabelContainer.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.size.width - 32).isActive = true // for 16 - 16 padding
    }
}


class YourViewController: UIViewController {

    @IBOutlet weak var yourCollectionView: UICollectionView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        yourCollectionView.delegate = self
        yourCollectionView.dataSource = self
        
        let nib = UINib(nibName: "YourCustomCell", bundle: nil) 
        yourCollectionView.register(nib, forCellWithReuseIdentifier: "cellReuseId")
        
        if let layout = yourCollectionView.collectionViewLayout as? UICollectionViewFlowLayout {
            layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM