我将CALayer添加到可滚动对象(UIScrollView,TableView,CollectionView)的顶部和底部,以便在可见区域后面有内容时显示它们。
class TableViewWithCALayers: UITableView {
var topGradientLayer: CAGradientLayer?
var bottomGradientLayer: CAGradientLayer?
override func layoutSubviews() {
super.layoutSubviews()
guard self.topGradientLayer != nil && self.bottomGradientLayer != nil else {
addGradientLayerToTop() // create layer, set frame, etc.
addGradientLayerToBottom()
return
}
// addGradientLayerToTop()// if uncomment it - multiple layers are created and they are visible, but this is not the solution...
handleLayerAppearanceAfterLayoutSubviews() // playing with opacity here
}
我如何创建图层:
func addGradientLayerToTop() {
if let superview = superview {
self.topGradientLayer = CAGradientLayer()
let colorTop = UIColor.redColor().CGColor
let colorBottom = UIColor.clearColor().CGColor
if let topLayer = self.topGradientLayer {
topLayer.colors = [colorTop, colorBottom]
topLayer.locations = [0.0, 1.0]
topLayer.frame = CGRect(origin: self.frame.origin, size: CGSizeMake(self.frame.width, self.layerHeight))
superview.layer.insertSublayer(topLayer, above: self.layer)
if (self.contentOffset.y == 0) {
// if we are at the top - hide layer
// topLayer.opacity = 0.0 //temporarily disabled, so it is 1.0
}
}
}
}
除了将TableView与xib文件一起使用外,TableViewWithCALayers 在各处都运行良好:
class XibFilesViewController : CustomUIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet var tableView: TableViewWithCALayers!
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.registerNib(UINib(nibName: "CustomTableViewCell", bundle: NSBundle.mainBundle()), forCellReuseIdentifier: "CustomTableViewCell")
self.tableView.layer.masksToBounds = false // this line doesn't help...
}
CustomUIViewController 用于许多其他ViewControllers,其中 TableViewWithCALayers 运行良好,因此不会产生问题。
顶部和底部的图层出现一秒钟,然后消失。来自 LayoutSubviews() func的日志说它们是可见的,不透明度是1.0,但有些内容涵盖了它们。它可以是什么以及如何处理它?</ p>
感谢任何帮助!)
topLayer.zPosition = 10000 //doesn't help
topLayer.masksToBounds = false //doesn't help as well
答案 0 :(得分:1)
使用nib文件时,这是一个很好的做法,并设计将要绘制图层的UIView添加到原型单元格中,或者标题/页脚,然后让该视图向您的班级确认&#39 ; s实际上处理图层。