swift - 渲染表视图很慢

时间:2016-01-30 05:56:42

标签: ios swift uitableview

我有一个表视图,我正在使用tableView.dequeueReusableCellWithIdentifier来重用单元格但是tableView非常慢。
慢,我的意思是将我的9个视图放在tableView中需要大约500毫秒。它在苹果A7 X64处理器上进行了测试,因此在较旧的处理器上它必须相当慢。 之所以这么慢,是因为有一些子视图和约束 但我看到更复杂的tableCells具有更好的性能,所以我必须要做的事情 喜欢缓存一个单元格或其他什么? 任何想法?

示例代码

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        tableView.registerNib(UINib(nibName: "ChatCell", bundle: nil), forCellReuseIdentifier: "ChatCell")
        let cell = tableView.dequeueReusableCellWithIdentifier("ChatCell") as! ChatCell
        return cell
}

3 个答案:

答案 0 :(得分:2)

  

它缓慢的原因是因为有一些子视图和约束。

就个人而言,我不建议你在单元格中使用约束,特别是当有很多子视图时,它会花费很多CPU时间并导致滚动延迟。相反,您可以根据单元格框架手动计算。

对于更多建议,我建议你花时间阅读这篇文章:Simple Strategies for Smooth Animation on the iPhone

答案 1 :(得分:1)

registerNib的通话通常只在viewDidLoad中进行一次,而不是每次要求cellForRowAtIndexPath中的单元格时。不确定这个电话有多慢,但这可能是你反应缓慢的原因。

答案 2 :(得分:0)

我认为您正在使用效果(如阴影或圆角等)或在UI上进行大量计算

编辑:已添加代码示例

//Add in your init func
tblView.registerClass(MSCustomVerticalListCell.self, forCellReuseIdentifier: NSStringFromClass(MSCustomVerticalListCell))

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
     let cell = tblView.dequeueReusableCellWithIdentifier(NSStringFromClass(MSCustomVerticalListCell), forIndexPath: indexPath) as! MSCustomVerticalListCell
     //add data binding
     cell.item = dataSource[indexPath.row]
     return cell
}

您的数据绑定类(数据模型):

class MSC_VCItem
{
    var Title:String!
    var Action:String!
    var SubTitle:String!
    var Icon:String!

    init(title:String!,subTitle:String!,icon:String!,action:String!)
    {
        self.Title = title
        self.SubTitle = subTitle
        self.Icon = icon
        self.Action = action
    }
}

最后你自定义表格单元格:

class MSCustomVerticalListCell : UITableViewCell {
    let padding = 5
    let imageWidth = 50
    var customImageView: UIImageView!
    var customTitleLabel: UILabel!
    var customSubtitleLabel: UILabel!
    var item: MSC_VCItem? {
        didSet {
            if let it = item {
                customTitleLabel.text = it.Title
                customSubtitleLabel.text = it.SubTitle
                UIImage.loadFromCacheOrURL(it.Icon, callback: { (image: UIImage) -> () in
                    self.customImageView.image = image
                })
                setNeedsLayout()
            }
        }
    }

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.backgroundColor = UIColor.clearColor()

        customTitleLabel = UILabel(frame: CGRectZero)
        self.addSubview(customTitleLabel)

        customSubtitleLabel = UILabel(frame: CGRectZero)
        contentView.addSubview(customSubtitleLabel)

        customImageView = UIImageView(frame: CGRectZero)
        customImageView.image = UIImage(named: "default")
        contentView.addSubview(customImageView)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        //Write your UI here like bg color or text color
    }
}