2017-01-10 2 views
0

Для приложения iOS в Swift я использую программные ограничения и хотел бы добавить 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

пожалуйста, удалите двоеточие после * class * ключевое слово – Hamsternik

+0

@ Хамстерник только что изменил его сейчас – Edward

ответ

2

Есть слои, которые вы добавляете к просмотру не будет осуществляться под AutoLayout и нет способа сделать это возможным.

Что вы можете сделать, это сохранить слой как свойство (возможно, на контроллере представления).

Тогда в методе ...

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 - Спасибо за вашу помощь @Matt – Edward

1

Вы должны изменить следующую строку кода:

gradientLayer.frame = self.frame 

к:

gradientLayer.frame = bounds 

Это важно, так как рама и границы не используя те же координатного пространства. Frame - это координатное пространство супервизора, а границы - внутреннее координатное пространство представления.

Вы также можете точно сказать, что это точка и конечная точка вашего градиента, прежде чем добавить ваш gradientLayer к слою:

gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5) 
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5) 
layer.addSublayer(gradientLayer) 
Смежные вопросы