2017-07-17 67 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