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