2017-07-17 65 views
0

我有一个UIView内的UITableView,它是由通过下面的类定义的自定义细胞的滚动:Laggy的UITableView因为CAShapeLayer(SWIFT 3)

class CustomAddFriendTableViewCell: UITableViewCell { 
    @IBOutlet weak var UsernameLbl: UILabel! 
    @IBOutlet weak var ProfileImg: UIImageView! 
    @IBOutlet weak var AddFriendBtn: UIButton! 
} 

内的ViewController的tableview(_:cellForRowAt:)方法我称之为以下功能布局单元格的ProfileImg:

private func layoutProfilePics(with cell:CustomAddFriendTableViewCell) { 
    //create gradient 
    let gradient = CAGradientLayer() 
    gradient.frame = CGRect(origin: CGPoint.zero, size: cell.ProfileImg.frame.size) 
    gradient.colors = [Colors.blueGreen.cgColor, Colors.yellow.cgColor] 

    //create gradient mask 
    let shape = CAShapeLayer() 
    shape.lineWidth = 3 
    shape.path = UIBezierPath(ovalIn: cell.ProfileImg.bounds).cgPath // commenting this out makes lag go away 
    shape.strokeColor = UIColor.black.cgColor // commenting this out makes lag go away 
    shape.fillColor = UIColor.clear.cgColor 
    gradient.mask = shape 

    cell.ProfileImg.layoutIfNeeded() 
    cell.ProfileImg.clipsToBounds = true 
    cell.ProfileImg.layer.masksToBounds = true 
    cell.ProfileImg.layer.cornerRadius = cell.ProfileImg.bounds.size.width/2.0 
    cell.ProfileImg.layer.addSublayer(gradient) 

} 

此代码会导致ProfileImg是一个圆圈,并有一个边境蓝绿色渐变。 注释旁边的两行使得滚动非常平滑(意思是渐变不是导致滞后的原因),所以我假设呈现CAShapeLayer(特别是中风)导致问题(因此是问题标题)。我能做些什么来改善tableview的滚动性能?另外,我不确定这是否是XCode错误,或者它与我的问题有关,但是在Project Navigator的Instruments窗格中,当我运行应用程序并滚动laggy UITableView时,FPS不会反映了滞后性,尽管我可以清楚地说出这是非常滞后的。实际上,面板中的任何组件(CPU,内存,能源影响等)都没有明显差异。

更新:

我试图移动layoutProfilePics(with:)功能为CustomAddFriendTableViewCellprepareForReuse()功能,我也试图把layoutProfilePics(with:)在其layoutSubviews()功能,但他们都没有改善的滚动。

+0

你应该改变'tableview(_:cellForRowAt:)'中的内容。你的这种方法在创建单元格时是一个很好的候选者,而不是在出列时。 –

+0

我试着将函数移动到自定义单元格的类的'layoutSubviews()'函数中,并尝试将它移动到自定义单元格的类的'prepareForReuse()'函数,但都没有改进tableivew的滚动性能。 – RPatel99

+2

您是否确保只将这些图层添加到每个单元格中?请记住,单元格可以重复使用,并且在第一次使用时添加到单元格中的任何图层在重用时都会保留在那里,除非您删除它们。 –

回答

1

该代码旨在为每个单元调用一次,为此,不应在tableView(_:cellForRowAt:)中调用该代码。尝试代码迁移到awakeFromNib(),如果您使用的是笔尖为您的自定义单元格,使用下面的代码在viewDidLoad()加载网点:

let addFriendCellNib = UINib(nibName: "CustomAddFriendTableViewCell", bundle: nil) 
tableView.register(addFriendCellNib, forCellReuseIdentifier: "addFriendCell") 

我希望你的作品。

+0

这工作。谢谢!另外,你知道为什么仪器没有显示任何通常在滞后时看到的数据吗? – RPatel99

+0

不确定你指的是什么数据。滞后是由于您的用户界面在滚动期间变得相当大;每次单元出队时添加一个图层。 –

+0

我所指的数据是XCode中Project Navigator窗格中第6个选项卡上的CPU性能,FPS,内存等。而你的意思是相当大的? – RPatel99