2017-12-22 23 views
1

私は長いUIViewを持つ標準グラデーションのトップボトムを作ろうとしています。しかし、それは完全ではありません。ペン先はUITableViewCellの一部なので、viewDidLayoutSubviews()にはthis threadのようにアクセスできません。なぜUITableViewCellのグラデーションレイヤーがフレーム全体をカバーしていないのですか?

enter image description here

私は、このビューのコードバージョンからcontentView.layoutIfNeeded()を呼び出すようにしようとしました。 UITableView cellForRowAtIndexPathが呼び出されたときに呼び出されました。しかしそれは効果がありません。

awakeFromNib()の勾配を作成します。

let colors = [ 
      UIColor(red: 33/255.0, green: 33/255.0, blue: 33/255.0, alpha: 1.0).cgColor, 
      UIColor(red: 51/255.0, green: 51/255.0, blue: 51/255.0, alpha: 1.0).cgColor] 
let gradient = CAGradientLayer() 
gradient.frame = gradientView.bounds 
gradient.colors = colors 
gradientView.layer.insertSublayer(gradient, at: 0) 

私のコードに何か問題がありますか?

答えて

3

frameではなく、ビューのboundsを使用する必要があります。これは、レイヤーがビューの内側にあり、フレームにオフセットがある可能性があるからです。

awakeFromNibの後にビューのレイアウトが変更されます。したがって、ビューのlayoutSubviewsのレイヤーのサイズを変更する必要があります。このためにプロパティgradientを作成して:

let gradient: CAGradientLayer = CAGradientLayer() 

override func awakeFromNib() { 
    ... 
    let colors = [ 
       UIColor(red: 33/255.0, green: 33/255.0, blue: 33/255.0, alpha: 1.0).cgColor, 
       UIColor(red: 51/255.0, green: 51/255.0, blue: 51/255.0, alpha: 1.0).cgColor] 
    gradient.frame = bounds 
    gradient.colors = colors 
    gradientView.layer.insertSublayer(gradient, at: 0) 
    ... 
} 

override func layoutSubviews() { 
    super.layoutSubviews() 
    gradient.frame = bounds 
} 

EDIT:代替が自身のレイヤクラスとカスタムビューである:あなたが持つ静的な色を置き換えることができますので、

public class GradientLayer: UIView { 
    @IBInspectable var startColor: UIColor! = UIColor(red: 33/255.0, green: 33/255.0, blue: 33/255.0, alpha: 1.0) 
    @IBInspectable var endColor: UIColor! = UIColor(red: 51/255.0, green: 51/255.0, blue: 51/255.0, alpha: 1.0) 

    override class var layerClass : AnyClass { 
     return CAGradientLayer.self} 
    } 
    override func awakeFromNib() { 
     super.awakeFromNib() 
     let colors = [ startColor.cgColor, endColor.cgColor ] 
     let gradient as self.layer as CAGradientLayer 

     gradient.colors = colors 
    } 
} 

これは、よりエレガントでありますIB inspectables、再利用可能なコンポーネントビューがあります。

+1

よろしくお願いいたします。+1 –

+0

ごめんなさい。実際には、グラデーションビューから 'bounds'を使用しています。とにかくあなたの解決策を試してみましょう。 –

+0

私は、レイヤーが別のビューに属しているのを見ただけです。私はコードを変更しましたが、レイヤーを含むビュー( 'gradientView')がレイヤーのレイアウトを管理する方が良いと思います。 – clemens

関連する問題