【问题标题】:UIView: cannot add multiple CALayer, only the root one appearsUIView:不能添加多个CALayer,只出现root一个
【发布时间】:2021-06-08 10:41:47
【问题描述】:

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

我试过了:

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)
    }
}

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

为什么会这样?谢谢你的帮助

【问题讨论】:

    标签: ios uiview uikit calayer


    【解决方案1】:

    两个问题...

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

    快速尝试一下:

    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)
    
        }
    
    }
    

    【讨论】:

    • 非常感谢!我不知道backgroundColor。为了更方便,我创建了一个UIView 子视图并将相关代码移动到layoutSubviews(),它工作得很好。再次感谢!
    • @AnotherDude - 是的......一旦你想一想——如果层是空的,就没有什么可以“投下阴影”——这很有意义:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2012-07-15
    • 2023-04-05
    • 2013-06-06
    • 2010-11-09
    • 2012-01-25
    相关资源
    最近更新 更多