表示領域の背後にコンテンツがあるときにスクロール可能オブジェクト(UIScrollView、TableView、CollectionView)の上下にCALayerを追加して表示します。CALayerが1秒間表示されてから消えます。
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
}
}
}
}
TableViewWithCALayers 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他の多くのViewControllersどこで使用されているがTableViewWithCALayersはうまく動作するので、問題は発生しません。 上下のレイヤーが1秒間表示されてから消えます。 からのログLayoutSubviews() funcは表示され、不透明度は1.0ですが、何かがそれらをカバーしています。何ができるのか、それをどう対処するのですか?
すべてのヘルプは歓迎です!)
topLayer.zPosition = 10000 //doesn't help
topLayer.masksToBounds = false //doesn't help as well