当前位置: 首页 > 知识库问答 >
问题:

UIView:不能添加多个CALayer,只显示根CALayer

权浩阔
2023-03-14

我正在尝试添加一些子层到根视图层。想法是混合一个黄色和红色阴影的视图。

我试过这个:

class ViewController: UIViewController {
    @IBOutlet weak var testView: UIView! {
        didSet {
            testView.backgroundColor = .white
            testView.layer.cornerRadius = 10.0
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .black
        
        testView.layer.shadowColor = UIColor.yellow.cgColor
        testView.layer.shadowOpacity = 1.0
        testView.layer.shadowRadius = 24.0
        
        let layer1 = CALayer()
        layer1.frame = testView.bounds
        layer1.shadowColor = UIColor.red.cgColor
        layer1.shadowOpacity = 1.0
        layer1.shadowRadius = 24.0
        testView.layer.addSublayer(layer1)
    }
}

但只出现根层(黄色的),而不是红色的子层:

为什么会出现这种情况?谢谢你的帮助

共有1个答案

公冶峰
2023-03-14

两个问题...

  1. 要使图层具有阴影,它必须具有背景色。
  2. TestView可能不是ViewDidLoad()中的最终大小...您应该在ViewDidLoad之后添加层,或者子类UIView并在LayoutSubViews
  3. 中设置层的框架

快速尝试一下:

class SubLayerShadowViewController: UIViewController {

    let testView = UIView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .black
        
        testView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(testView)

        let g = view.safeAreaLayoutGuide
        
        NSLayoutConstraint.activate([
            testView.widthAnchor.constraint(equalToConstant: 240.0),
            testView.heightAnchor.constraint(equalTo: testView.widthAnchor),
            testView.centerXAnchor.constraint(equalTo: g.centerXAnchor),
            testView.centerYAnchor.constraint(equalTo: g.centerYAnchor),
        ])
        
        testView.backgroundColor = .white
        testView.layer.cornerRadius = 10.0
        
        testView.layer.shadowColor = UIColor.yellow.cgColor
        testView.layer.shadowOpacity = 1.0
        testView.layer.shadowRadius = 24.0

        // move this out of viewDidLoad()
        //let layer1 = CALayer()
        //layer1.cornerRadius = 10.0
        //layer1.frame = testView.bounds
        //layer1.shadowColor = UIColor.red.cgColor
        //layer1.shadowOpacity = 1.0
        //layer1.shadowRadius = 24.0
        //testView.layer.addSublayer(layer1)

    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        
        let layer1 = CALayer()
        layer1.cornerRadius = 10.0
        layer1.frame = testView.bounds
        layer1.shadowColor = UIColor.red.cgColor
        layer1.shadowOpacity = 1.0
        layer1.shadowRadius = 24.0
        
        // set this layer's backgroundColor to the view's backgroundColor
        layer1.backgroundColor = testView.backgroundColor?.cgColor

        testView.layer.addSublayer(layer1)

    }

}
 类似资料:
  • 我正在用C编写一个简单的二叉树程序,现在它只存储在根节点输入的最新值,例如,如果我在树中输入10,然后在树中输入9,那么9只是覆盖10作为根节点,所以树只存储值9。 我在网上查看了多个C二叉树解决方案,并尝试了它们的实现版本,但仍然没有成功。 这是树中单个节点的结构 到目前为止,我的二叉树课程 插入方法 然后在这样的菜单中调用这个方法 逻辑对我来说似乎都很好,除了我尝试不使用构造函数而只是单独设置

  • 我正在使用Java-Eclipse和oracle SGBD public DefaultTableModel getJoueurData(){

  • 我正在做一个需要VBoxes的“列表”表示的项目。我的应用程序分层布局是gridpane->VBox(在其中一个单元格中)->VBox(在彼此之上显示不同的数据集)->data。我有两个场景。 我的场景1控制器(控制器)如下所示: 这样设计是因为dataBox包含比标签更多的元素,但在本文中,这似乎与我无关。 我的场景2控制器(addDataController)如下所示: 我没有发布主类,因为加

  • 问题内容: 好的,所以我做了一个小程序教程,并且我读到该方法是运行小程序所必需的。确实如此。至少在我的IDE(Eclipse)中。Applet Viewer在运行我的applet时没有问题,当我尝试用HTML 进行标记时,什么也不会显示,但是它的作用就好像有什么东西(标记更改了文本位置)。这是我的小程序: 这是我在网页上使用的代码: 即使删除width / height参数,我也会得到相同的结果(

  • 我按照文档https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/来创建一个kubernetes集群,在我的本地Mac中使用3个vagrant ubuntu vm。但是我只能在“kubeadm join”成功后在master节点中运行“kubectl get nodes”才能看到master。在尝试了几种可能的方法从互