简体   繁体   English

iOS:父视图覆盖的子视图阴影

[英]iOS: Shadow of subview covered by parent view

I have a view that has a subview.我有一个有子视图的视图。 I would like the subview to have a shadow, not covered by the parent view.我希望子视图有一个阴影,而不是被父视图覆盖。 This works if the parent view is transparent, but if it's not part of the shadow is covered by it.如果父视图是透明的,则此方法有效,但如果它不是阴影的一部分,则被它覆盖。 I tried setting the zPosition of the subview and it didn't work.我尝试设置子视图的 zPosition 并没有奏效。

Here's what it looks like:这是它的样子:

在此处输入图像描述

And here's my code, which you can copy-paste into a Playground:这是我的代码,您可以将其复制粘贴到 Playground 中:

import UIKit
import PlaygroundSupport

import UIKit

class MyViewController : UIViewController {
    override func loadView() {
        let view = UIView()
        view.backgroundColor = .white

        let myView = MyView(frame: .init(x: 30,
                                         y: 30,
                                         width: 200,
                                         height: 200))

        view.addSubview(myView)
        self.view = view
    }
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()

class MyView: UIView {
    let upper = UIView()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }
    
    private func commonInit() {
        upper.backgroundColor = .red
        upper.translatesAutoresizingMaskIntoConstraints = false
        addSubview(upper)
        
        NSLayoutConstraint.activate([
            upper.topAnchor.constraint(equalTo: topAnchor),
            upper.leadingAnchor.constraint(equalTo: leadingAnchor),
            upper.trailingAnchor.constraint(equalTo: trailingAnchor),
            upper.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 0.8)
        ])
        
        self.backgroundColor = .yellow
        
        layer.shadowColor = UIColor.blue.cgColor
        layer.shadowOpacity = 1
        layer.shadowOffset = .zero
        layer.shadowRadius = 5
        
        // desperate attempts
        upper.layer.zPosition = 1
        upper.layer.masksToBounds = false
        layer.masksToBounds = false
        bringSubviewToFront(upper)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        layer.shadowPath = UIBezierPath(rect: upper.frame).cgPath
    }
}

If you want subview to have shadow.. apply shadow to subview like this如果您希望子视图有阴影.. 像这样将阴影应用于子视图

    upper.layer.shadowColor = UIColor.blue.cgColor
    upper.layer.shadowOpacity = 1
    upper.layer.shadowOffset = .zero
    upper.layer.shadowRadius = 5

From this code what you get is this从这段代码中你得到的是

在此处输入图像描述

Let me know if i get it wrong and you need something else... i will try to do that as well to help you out让我知道如果我弄错了并且您需要其他东西...我也会尝试这样做以帮助您

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM