【问题标题】:Swift uiview with rounded corners and drop shadow does not work带有圆角和阴影的 Swift uiview 不起作用
【发布时间】: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 修复了它。发表答案,我会接受:)

标签: ios swift uiview


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-06-12
    • 2012-07-11
    • 1970-01-01
    • 2014-09-15
    • 2014-10-24
    相关资源
    最近更新 更多