我有一个表视图,我正在使用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
}
答案 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
}
}