Sta*_*yer 8 uiview dropshadow swift
下面是自定义卡片视图的代码。问题是,当我在界面构建器中将子视图添加到此时,它不会将角半径应用于子视图。在大多数情况下,我可以通过使子视图具有清晰的背景颜色来解决这个问题,但我正在努力使用UIImageView. 当我将它添加到卡片时,它最终会出现尖角,而且我无法修复它。
这里的各种解决方案都建议添加第二层来显示阴影。我已经尝试过,但它仍然无法按预期工作。我想要实现的是带有圆角的视图,阴影和添加任何子视图(例如UIImageView)也应该保持圆角半径而不是指出。
我已经尝试了各种设置,layer.masksToBounds并且self.clipsToBounds我似乎总是得到带有圆角半径的子视图,但没有阴影或阴影可见且视图没有剪裁。
@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)
}
}
Run Code Online (Sandbox Code Playgroud)
您尝试实现第二个视图来处理阴影的方式几乎是正确的,只是您没有保持正确的顺序。
您的CardView班级已经处理显示阴影。保持该视图不变,而是添加一个名为“ ContentView”的 UIView作为子视图。该内容视图与 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)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4148 次 |
| 最近记录: |