如何在使用编程约束时将CAGradientLayer添加到UIView

时间:2017-01-10 10:33:03

标签: ios swift nslayoutconstraint cagradientlayer

对于Swift中的iOS应用程序,我使用程序化约束,并希望将一个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的事实有关,然后我尝试通过将其框架设置为等于框架视图来添加渐变图层。当我不使用程序化约束时,此代码有效。我有什么想法/做错了吗?

3 个答案:

答案 0 :(得分:4)

您添加到视图中的任何图层都不会在AutoLayout下进行管理,并且无法实现此目的。

您可以做的是将图层存储为属性(可能在视图控制器上)。

然后在方法中......

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

在此方法中,视图将具有正确的框架,因此如果它已更改,则需要更新图层以相应地设置新框架。

答案 1 :(得分:1)

您应该更改以下代码行:

gradientLayer.frame = self.frame

为:

gradientLayer.frame = bounds

这很重要,因为框架和边界不使用相同的坐标空间。 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)

答案 2 :(得分:0)

应立即调用

SELECT * FROM conversations_by_most_recent_message PER PARTITION LIMIT 1; 更新视图。

public class FrameTest extends JFrame{

private JCheckBox jb1;
private JCheckBox jb2;
private JCheckBox jb3;
private JCheckBox jb4;
private JCheckBox jb5;
private JPanel jPanel1;

/**
 * Creates new form CheckBoxDinamico
 */
public FrameTest() {

    setLayout(new GridBagLayout());
    setPreferredSize(new Dimension(800, 600));
    jPanel1 = new JPanel();
    jPanel1.setLayout(new FlowLayout());
    add(jPanel1);

    jb1 = new JCheckBox("Cleaning");
    jb2 = new JCheckBox("Have dinner with friend");
    jb3 = new JCheckBox("Go sleep by 11pm");
    jb4 = new JCheckBox("Wake Up by 6am");
    jb5 = new JCheckBox();

    try {

        if(jb5.getText() == null || "".equals(jb5.getText())){
            jb5.setText(new Scanner(System.in).nextLine());
        }
        jPanel1.add(jb1);
        jPanel1.add(jb2);
        jPanel1.add(jb3);
        jPanel1.add(jb4);
        jPanel1.add(jb5);
    } catch (Exception e) {
    }
   pack();
} 

public static void main(String args[]) {
    new FrameTest().setVisible(true);
}