带有圆角和阴影的 Swift uiview 不起作用

Posted

技术标签:

【中文标题】带有圆角和阴影的 Swift uiview 不起作用【英文标题】:Swift uiview with rounded corners and drop shadow does not work 【发布时间】:2016-10-26 15:40:33 【问题描述】:

我正在尝试向我的 UIView 添加圆角和阴影:

myView.layer.cornerRadius = 2
myView.layer.masksToBounds = false    
    myView.layer.shadowColor = UIColor.black.cgColor
    myView.layer.shadowOffset = CGSize(width: 0, height: 1)
    myView.layer.shadowOpacity = 0.4
    myView.layer.shadowPath = UIBezierPath(roundedRect: myView.bounds, cornerRadius: 2).cgPath

但这会使阴影在右侧和底部下降很远,这是错误的。

我将这段代码放在 ViewDidLoad() 中,因为我的 UIView 已经有另一个子类,所以我想在 VC 中而不是在子类中添加阴影

但如果我将代码放在子类中,它将起作用:

import UIKit

public class ShadowView: UIView 

    open var cornerRadius: CGFloat = 2

    open var shadowOffsetWidth: Int = 0
    open var shadowOffsetHeight: Int = 2
    open var shadowColor: UIColor? = UIColor.black
    open var shadowOpacity: Float = 0.4

    override open func layoutSubviews() 

        layer.cornerRadius = cornerRadius
        let shadowPath = UIBezierPath(roundedRect: bounds, cornerRadius: cornerRadius)

        layer.masksToBounds = false
        layer.shadowColor = shadowColor?.cgColor
        layer.shadowOffset = CGSize(width: shadowOffsetWidth, height: shadowOffsetHeight)
        layer.shadowOpacity = shadowOpacity
        layer.shadowPath = shadowPath.cgPath
    


但是,如何将代码放在我的主 VC 中而不是子类中?

【问题讨论】:

我会尝试将您的 VC 层代码放入 viewDidLayoutSubviews 而不是 viewDidLoad。到那时,您的视图将正确调整大小。 (顺便说一句,我不禁注意到您的 ShadowView 代码没有调用 super.layoutSubviews) @JoshuaKaden 代码来自这个仓库:github.com/NathanWalker/MaterialCard,为什么我必须调用 super.layoutSubviews? 在覆盖时调用 super 是一种很好的 OOP 实践。这是 SOLID 中的 L:en.wikipedia.org/wiki/SOLID_(object-oriented_design) @JoshuaKaden viewDidLayoutSubviews 修复了它。发表答案,我会接受:) 【参考方案1】:

我会尝试将您的 VC 层代码放入 viewDidLayoutSubviews 而不是 viewDidLoad。到那时,您的视图将正确调整大小。

【讨论】:

以上是关于带有圆角和阴影的 Swift uiview 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有圆角和阴影的 UIView?

带有圆角和阴影的 UIView?

带有圆角和阴影的 UIView?

UIView iOS Swift下的多个阴影

带有圆角的 UIView CAGradient?

带有渐变和阴影的 UIView