2017-01-03 2 views
1

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 

Antwort

1

Bei der Verwendung von nib-Dateien ist es gute Praxis, und das Design der UIView hinzuzufügen, dass Sie die Schicht, die auf in Ihre Prototypzelle zeichnen möchten, oder Kopf-/leichtfüßig und dann Lassen Sie diese Ansicht Ihrer Klasse bestätigen, die die Ebene tatsächlich behandelt.

Verwandte Themen