【问题标题】:iOS: Shadow of subview covered by parent viewiOS:父视图覆盖的子视图阴影
【发布时间】:2020-06-25 07:10:30
【问题描述】:

我有一个包含子视图的视图。我希望子视图有一个阴影,而不是被父视图覆盖。如果父视图是透明的,则此方法有效,但如果它不是阴影的一部分,则被它覆盖。我尝试设置子视图的zPosition,但没有成功。

它是这样的:

这是我的代码,您可以将其复制粘贴到 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
    }
}

【问题讨论】:

    标签: ios swift uiview calayer uibezierpath


    【解决方案1】:

    如果你想让子视图有阴影 .. 像这样将阴影应用到子视图

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

    从这段代码中你得到的是这个

    如果我弄错了,请告诉我,您还需要其他东西……我也会尽力帮助您解决问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 2019-03-12
      相关资源
      最近更新 更多