背景:我的應用程式允許用戶選擇漸變邊框以應用于根據其中的內容動態調整大小的 UITableViewCells。我目前正在通過將 CAGradientLayer 子層插入到單元格內的 UIView 來創建此邊框。
問題:因為每個單元格的大小不同,我通過在我的自定義單元格類中覆寫 layoutIfNeeded 來調整 CAGradientLayer 的大小。這可行,但似乎不是最理想的,因為邊框被一遍又一遍地重繪,并且隨著單元格的大小調整而閃爍。
螢屏截圖鏈接: https ://drive.google.com/file/d/1SiuNozyUM7LCdYImZoGCWeoeBKu2Ulcw/view?usp=sharing
問題:我需要采取不同的方法來創建此邊界嗎?或者我錯過了關于 UITableViewCell 生命周期的一些東西?我在 SO 上遇到過類似的問題,但似乎沒有一個可以解決這個重繪問題。謝謝您的幫助。
CAGradientLayer 擴展創建邊框
extension CAGradientLayer {
func createBorder(view: UIView, colors: [CGColor]) {
self.frame = CGRect(origin: CGPoint.zero, size: view.bounds.size)
self.colors = colors
let shape = CAShapeLayer()
shape.lineWidth = 14
shape.path = UIBezierPath(roundedRect: view.bounds, cornerRadius: 12).cgPath
shape.strokeColor = UIColor.black.cgColor
shape.fillColor = UIColor.clear.cgColor
self.mask = shape
}
}
TableViewCell 類 - 插入 CAGradientLayer
override func awakeFromNib() {
super.awakeFromNib()
reportCard.layer.insertSublayer(gradientLayer, at: 0)
...
}
TableViewCell 類 - 調整邊框大小并應用用戶選擇的設計
override func layoutIfNeeded() {
super.layoutIfNeeded()
switch currentReport?.frameId {
case "sj_0099_nc_frame_001":
gradientLayer.createBorder(view: reportCard, colors: [App.BorderColors.lavender, App.BorderColors.white])
case "sj_0099_nc_frame_002":
gradientLayer.createBorder(view: reportCard, colors: [App.BorderColors.red, App.BorderColors.white])
case "sj_0099_nc_frame_003":
gradientLayer.createBorder(view: reportCard, colors: [App.BorderColors.yellow, App.BorderColors.white])
default:
gradientLayer.createBorder(view: reportCard, colors: [App.BorderColors.white, App.BorderColors.white])
}
}
uj5u.com熱心網友回復:
原來我一直在找錯地方。我原始帖子中的代碼是功能性的,并且在 layoutIfNeeded() 或 setNeedsLayout() 中更新 gradientLayer 框架而不是 layoutSubviews() 可以準確地繪制 gradientLayer。根據 Apple 檔案,不應直接呼叫 layoutSubviews()。
錯誤的來源不在我的自定義單元格中,而是在我的 tableViewController 中。我有一個無關的呼叫 reloadData()。
uj5u.com熱心網友回復:
而不是里面 awakeFromNib() 使用這個
override func layoutSubviews() {
super.layoutSubviews()
reportCard.layer.insertSublayer(gradientLayer, at: 0)
reportCard.clipsToBounds = true
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/410274.html
標籤:
上一篇:自定義單元格在TableView控制器中注冊和使用,但在應用程式中是默認單元格
下一篇:單擊特定按鈕時關閉應用程式
