2017-01-10 6 views
0

Swift의 iOS 앱의 경우 프로그래밍 방식 제약 조건을 사용하고 UIView()에 CAGradientLayer()를 추가하려고합니다. 아래 코드는 작동하지 않습니다.프로그래밍 방식의 제약 조건을 사용할 때 UIView에 CAGradientLayer를 추가하는 방법

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

* class * 키워드 뒤에 콜론을 제거하십시오. – Hamsternik

+0

@Hamsternik이 방금 변경했습니다. – Edward

답변

2

당신이보기에 추가 한 모든 층이 자동 레이아웃과에서 관리되지 않습니다 이것이 일어날 수있는 방법이 없습니다.

당신이 할 수있는 일은 (아마도보기 컨트롤러에서) 속성으로 레이어를 저장하는 것입니다. 이 방법에서는 방법에있어서 그런

...

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

뷰는이 그에 따라 새로운 프레임을 가지고 레이어를 업데이트해야합니다 변경, 그래서 만약 적절한 프레임의 것입니다.

0

layoutIfNeeded()은 즉시 업데이트 된보기에 호출해야합니다.

gradientLayer.frame = self.frame 

에 : 프레임과 경계가 같은 좌표 공간을 사용하지 않기 때문에

gradientLayer.frame = bounds 

이 중요

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

당신은 코드의 다음 줄을 변경해야합니다. frame은 superview의 좌표 공간이며 bounds는 뷰의 내부 좌표 공간입니다.

또한 계층에 gradientLayer를 추가하기 전에 그라디언트의 시작점과 끝 점이 무엇인지 정확하게 알 수 있습니다 :

gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5) 
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5) 
layer.addSublayer(gradientLayer) 
관련 문제