gpt4 book ai didi

swift - 带有角半径和阴影 View 的 UIView 不会在角中剪切 subview

转载 作者:搜寻专家 更新时间:2023-11-01 05:32:54 24 4
gpt4 key购买 nike

下面是自定义卡片 View 的代码。问题是,当我在界面生成器中向此添加 subview 时,它不会将角半径应用于 subview 。在大多数情况下,我可以通过使 subview 具有清晰的背景颜色来解决这个问题,但我正在努力使用 UIImageView。当我将其添加到卡片中时,它最终会出现尖角,但我无法修复它。

这里的各种解决方案都建议添加第二层来显示阴影。我试过这个,但它仍然没有按预期工作。我想要实现的是一个带有圆角、投影和添加任何 subview (例如 UIImageView)的 View 也应该保持圆角半径而不是指向外面。

我尝试了 layer.masksToBoundsself.clipsToBounds 的各种设置,我似乎总是得到带有圆角半径但没有阴影或阴影可见的 subview , View 不剪裁。

@IBDesignable class CardView: UIView {

@IBInspectable dynamic var cornerRadius: CGFloat = 6
@IBInspectable dynamic var shadowOffsetWidth: Int = 2
@IBInspectable dynamic var shadowOffsetHeight: Int = 2
@IBInspectable dynamic var shadowColor: UIColor? = UIColor(netHex: 0x333333)
@IBInspectable dynamic var shadowOpacity: Float = 0.5

override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func layoutSubviews() {
commonInit()
}

override func prepareForInterfaceBuilder() {
commonInit()
}

func commonInit() {

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

// This was how I tried to add a seperate shadow layer
// let shadowView = UIView(frame: self.frame)
// shadowView.layer.shadowColor = shadowColor?.cgColor
// shadowView.layer.shadowOffset = CGSize(width: shadowOffsetWidth, height: shadowOffsetHeight)
// shadowView.layer.shadowOpacity = shadowOpacity
// shadowView.layer.shadowPath = shadowPath.cgPath
// shadowView.layer.masksToBounds = false
//
// self.addSubview(shadowView)

}

}

最佳答案

您尝试实现第二个 View 来处理阴影的方式几乎是正确的,您只是没有保持正确的顺序。

您的 CardView 类已经处理了显示阴影。保持该 View 不变,而是添加一个名为“ContentView”的 UIView 作为 subview 。该内容 View 与您的 CardView 具有相同的框架和圆角半径。

在“ContentView”上,您不需要对阴影做任何处理。相反,将其图层的 masksToBounds 属性设置为 true。现在将您想要在卡片中显示的所有内容添加到“ContentView”,它应该会正确剪辑。

func commonInit() {

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

let contentView = UIView()
contentView.frame = self.frame
contentView.layer.cornerRadius = cornerRadius
contentView.layer.masksToBounds = true

// any content you add should now be added to the contentView:
// contentView.addSubview(aView)
}

关于swift - 带有角半径和阴影 View 的 UIView 不会在角中剪切 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51631002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com