swift+ios7+snapkit+tableviewCell高度动态计算的坑

首先说下,我不确定别的环境下有没有问题,但我这确实有问题,没有时间去探索到底是snapkit的坑,还是哪里的问题。

说下描述,一般我们在ios8以上可以很自由的使用autolayout解决动态高度的问题,ios7一般要这么搞:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
            /// TODO Cache
            if let msg = getTIMMessageInSection(indexPath.section, row: indexPath.row) {
                if let cell = tableView.dequeueReusableCellWithIdentifier(getIdentifierByMessage(msg)) as? TTGroupChatCell {
                    bindData(cell, msg: msg)
                    return cell.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height + 1
                }
            }
            return 0
        }

    }

但是在我的环境下,神奇的发现,不管cell怎么搞,这个计算的值总是0。。。。

最后在cell里面搞了这么一个方法:

func calculateHeightRoughly() -> CGFloat {
        return contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
}

然后神奇的发现可以了。。即在外面替换成:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
            /// TODO Cache
            if let msg = getTIMMessageInSection(indexPath.section, row: indexPath.row) {
                if let cell = tableView.dequeueReusableCellWithIdentifier(getIdentifierByMessage(msg)) as? TTGroupChatCell {
                    bindData(cell, msg: msg)
                    return cell.calculateHeightRoughly()
            }
            return 0
        }

    }

是在不知道啥原理。。

PS,UILabel如果不能换行的话,要设置如下的:

label.preferredMaxLayoutWidth = 200

注意200是一个一定要比屏幕宽度小的值,这样才能换行。

Leave a Reply

Your email address will not be published.