UIView Custom Class在swift 3中触发shadow或roundCorners / addCornerRadius,但不能同时触发两者

时间:2018-03-28 12:35:05

标签: ios xcode swift3 uiview swift4

UIView Custom Class仅触发阴影。我想为特定边缘显示阴影和圆角。这是我的代码。任何建议将不胜感激。

    extension UIView {
        func roundCorners(_ corners: UIRectCorner, radius: CGFloat) {
        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        self.layer.mask = mask
    }
}
    class CustomView: UIView {
     override func layoutSubviews() {
            self.shadowColor = UIColor.darkGray
            self.shadowOffset = CGSize(width: 4, height: 4)
            self.shadowOpacity = 0.5
            self.shadowRadius = 6.0
            //only rounded corners triggered in UI
            self.backgroundColor = UIColor.white
            self.roundCorners(corners: [.topRight, .bottomRight], radius: 15.0)
        }
    }

提前致谢

2 个答案:

答案 0 :(得分:0)

为阴影和边框使用单独的视图。基本视图是透明的并且具有阴影。边框视图会剪切其边框所具有的任何其他子内容。请参阅下面的代码。

//将阴影添加到基本视图

baseView.backgroundColor = UIColor.clear
baseView.layer.shadowColor = UIColor.black.cgColor
baseView.layer.shadowOffset = CGSize(width: 3, height: 3)
baseView.layer.shadowOpacity = 0.7
baseView.layer.shadowRadius = 4.0

//将边框添加到子视图

let borderView = UIView()
borderView.frame = baseView.bounds
borderView.layer.cornerRadius = 10
borderView.layer.borderColor = UIColor.black.cgColor
borderView.layer.borderWidth = 1.0
borderView.layer.masksToBounds = true
baseView.addSubview(borderView)

//添加您想要剪辑的任何其他子内容

let otherSubContent = UIImageView()
otherSubContent.image = UIImage(named: "lion")
otherSubContent.frame = borderView.bounds
borderView.addSubview(otherSubContent)

答案 1 :(得分:0)

使用此功能: -

func addShadow(view: UIView, corner: CGFloat) {
    view.layer.shadowColor = UIColor.gray.cgColor
    view.layer.shadowOpacity = 0.5
    view.layer.shadowRadius = 2
    view.layer.shadowOffset = CGSize(width: 1, height: 1)
    view.layer.masksToBounds = false
    view.layer.cornerRadius = corner
}