Ich füge CALayer oben und unten in scrollbaren Objekten (UIScrollView, TableView, CollectionView) hinzu, um sie anzuzeigen, wenn sich hinter dem sichtbaren Bereich ein Inhalt befindet.CALayer erscheint nur für eine Sekunde und verschwindet dann
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
}
Wie schaffe ich Schicht:
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
}
}
}
}
TableViewWithCALayers schön überall funktioniert, außer Tableview mit mit xib Dateien:
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 ist in vielen anderen Viewcontrollers verwendet, in denen TableViewWithCALayers funktioniert gut, daher sollte es kein Problem verursachen. Die Schichten oben und unten erscheinen für eine Sekunde und verschwinden dann. Protokolle von LayoutSubviews() func sagen, dass sie sichtbar sind und die Deckkraft 1.0 sind, aber etwas deckt sie ab. Was kann es sein und wie geht man damit um?
Jede Hilfe ist willkommen!)
topLayer.zPosition = 10000 //doesn't help
topLayer.masksToBounds = false //doesn't help as well