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

时间:2015-06-11 04:21:04

标签: ios swift uicollectionview uicollectionviewcell

所以我在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的大小。

1 个答案:

答案 0 :(得分:2)

这是查看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中的大小,因为它们共享相同的继承。 所以没有问题。 即使您可以根据文本中的字符数返回自定义高度。喜欢

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
}