iOS - 如何在标签文本更改后动态更新 UICollectionViewCell 大小

iOS - How to dynamically update UICollectionViewCell size after label text changed

所以我在 UICollectionView 中有一个单元格

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        var cell: myCell = collectionView.dequeueReusableCellWithReuseIdentifier("myCell", forIndexPath: indexPath) as! myCell
        // cell.descrption is an UILabel
        cell.description.text = newText
        return cell
    }

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
        return CGSizeMake(collectionView.bounds.width*0.95, collectionView.bounds.height/4)       
    }

我的问题是:

newText是从网络上获取的。所以它是动态变化的。将单元格的文本设置为 newText 后,我​​应该如何调整标签以使其大小适合 "newText" 以及我应该如何调整单元格的大小并在屏幕上显示?

我注意到 sizeForItemAtIndexPath()cellForItemAtIndexPath() 之前被调用。因此,我无法在 sizeForItemAtIndexPath().

内计算 nextText 的大小

这是检查 sizeForItemAtIndexPath() 中文本大小的好方法, 正如您已经知道 sizeForItemAtIndexPath()cellForItemAtIndexPath() 之前被调用,您可以拥有一个具有相同信息的虚拟单元格。例如,您可以参考我在UITableView中使用的代码并根据您的要求实现。

override func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
    var myLabel:UILabel!
    var labelText = myTextArray[indexPath.row]
    var constraint = CGSizeMake(662, MAXFLOAT);
    var attributes = NSDictionary(dictionary: [UIFont(descriptor: UIFontDescriptorSizeAttribute, size: 12):NSFontAttributeName])
    var textSize:CGRect = NSString(string: labelText).boundingRectWithSize(constraint, options: NSStringDrawingUsesLineFragmentOrigin, attributes: attributes, context: nil)
    myLabel.text = labelText
    return myLabel.frame.size.height
}

您可以在 UICollectionView 中执行相同的操作来实现大小,因为两者共享相同的继承。 所以不会有问题。 您甚至可以 return 根据文本中的字符数自定义高度。喜欢

override func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
    var myLabel:UILabel!

    var labelText = myTextArray[indexPath.row]
    if count(labelText) > 0 && count(labelText) <30
        return 40;
    else if count(labelText)>31 && count(labelText)<60
        return 70;
    //and so on
}