2017-01-10 7 views
0

SwiftのiOSアプリケーションでは、プログラム制約を使用しており、CAGradientLayer()をUIView()に追加したいと考えています。以下は動作しない私のコードです。プログラム制約を使用する場合、CAGradientLayerをUIViewに追加する方法

import UIKit 

    class ViewController: UIViewController { 

     let animationView: UIView = { 
      let view = UIView() 
      view.translatesAutoresizingMaskIntoConstraints = false 
      return view 
     }() 

     override func viewDidLoad() { 
      super.viewDidLoad() 

      view.addSubview(animationView) 
      setupAnimationView() 
      animationView.addGradientLayer() 
     } 

     func setupAnimationView() { 
      animationView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true 
      animationView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true 
      animationView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true 
      animationView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true 
     } 
    } 

    extension UIView { 

     func addGradientLayer() { 
      let color1 = UIColor(red: 251/255, green: 55/255, blue: 91/255, alpha: 1.0) 
      let color2 = UIColor(red: 1.0, green: 70/255, blue: 0, alpha: 1.0) 
      let gradientLayer = CAGradientLayer() 
      gradientLayer.name = "gradientLayer" 
      gradientLayer.frame = self.frame 
      gradientLayer.colors = [color1.cgColor, color2.cgColor] 
      self.layer.insertSublayer(gradientLayer, at: 0) 
     } 
    } 

私は信じている私が午前問題は、私はプログラム的制約とanimationViewを作成し、私は、試してみて、フレームのビューにそのフレームが等しい設定することにより、グラデーションレイヤーを追加しているという事実に関連しています。このコードは、プログラムの制約を使用しない場合に機能します。私が間違っている/間違っていることは何ですか?

+0

*クラス*キーワード – Hamsternik

+0

の後にコロンを削除してください@Hamsternikは今すぐ変更しました – Edward

答えて

2

ビューに追加し、任意の層は、自動レイアウトとで管理されることはありませんこれを実現させる方法はありません。

可能なことは、レイヤーを(おそらくビューコントローラ上に)プロパティとして保存することです。この方法ではその後

...この方法では

override func viewDidLayoutSubviews() { 
    super.viewDIdLayoutSubviews() 
    // update the layers frame based on the frame of the view. 
} 

ビューでは、それはあなたがそれに応じて新しいフレームを持っている層を更新する必要があります変更されているので、もしそれが適切なフレームですがあります。

0

layoutIfNeeded()は、すぐに更新されたビューに呼び出される必要があります。

animationView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true 
animationView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true 
animationView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true 
animationView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true 

view.layoutIfNeeded() 
+0

これは動作しませんでした – Edward

+0

グラデーションを描くことができましたか? – Matt

+0

ええ、私はviewDidLoadで私の注文で間違いを犯したと思う - あなたの助けを感謝@マット – Edward

1

あなたは、次のコード行変更する必要があります。フレームと境界が同じ座標空間を使用していないので、これは重要です

gradientLayer.frame = bounds 

:に

gradientLayer.frame = self.frame 

を。 Frameはスーパービューの座標空間、boundsはビューの内部座標空間です。

また、あなたの層にあなたのgradientLayerを追加する前に、あなたのグラデーションの開始点と終了点であるかを正確に伝えることができます:

gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5) 
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5) 
layer.addSublayer(gradientLayer) 
関連する問題