2017-01-03 1 views
1

J'ajoute CALayer en haut et en bas des objets défilables (UIScrollView, TableView, CollectionView) pour les afficher lorsqu'il y a un contenu derrière la zone visible.CALayer n'apparaît que pendant une seconde, puis disparaît

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 
    } 

Comment je crée couche:

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 fonctionne bien partout, sauf en utilisant TableView fichiers XIB:

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 est utilisé dans de nombreux autres ViewControllers où TableViewWithCALayers fonctionne bien, donc il ne devrait pas créer de problème. Les calques en haut et en bas apparaissent pendant une seconde, puis disparaissent. Les logs de LayoutSubviews() func disent qu'ils sont visibles et l'opacité est 1.0, mais quelque chose les couvre. Que peut-il être et comment y faire face?

Toute aide est appréciée!)

topLayer.zPosition = 10000 //doesn't help 
topLayer.masksToBounds = false //doesn't help as well 

Répondre

1

Lorsque vous utilisez des fichiers nib, il est une bonne pratique, et la conception pour ajouter le UIView que vous voulez dessiner la couche sur dans votre cellule prototype ou en-tête/pied puis que cette vue confirme à votre classe qui gère réellement la couche.