Добавьте тень для просмотра только с двумя углами с радиусом - PullRequest
0 голосов
/ 28 января 2020

Я построил вид только с двумя верхними углами, которые имеют угловой радиус, и двумя нижними, которые являются нормальными углами в 90 градусов:

extension UIView {
    func roundCorners(corners: UIRectCorner, radius: CGFloat) {
        let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        layer.mask = mask
    }
}

Я добавляю это к своему виду, просто выполнив:

override func layoutSubviews() {
    super.layoutSubviews()
    roundCorners(corners: [.topLeft, .topRight], radius: 15)
}

Теперь я хочу добавить тень к нему, и я попытался сделать следующее:

private var shadowLayer: CAShapeLayer!
override func layoutSubviews() {
    super.layoutSubviews()

    let corners: UIRectCorner = [.topLeft, .topRight]
    let radius: CGFloat = 15

    roundCorners(corners: corners, radius: radius)

    if shadowLayer == nil {
        shadowLayer = CAShapeLayer()
        shadowLayer.path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)).cgPath
        shadowLayer.fillColor = UIColor.white.cgColor

        shadowLayer.shadowColor = UIColor.darkGray.cgColor
        shadowLayer.shadowPath = shadowLayer.path
        shadowLayer.shadowOffset = CGSize(width: 2.0, height: 2.0)
        shadowLayer.shadowOpacity = 0.3
        shadowLayer.shadowRadius = 2

        layer.insertSublayer(shadowLayer, at: 0)
    }
}

Но это не работает (тень вообще не появляется) Как я могу это исправить?

Спасибо

1 Ответ

0 голосов
/ 28 января 2020

Решение, которое я нашел:

private var shadowLayer: CAShapeLayer!
override func layoutSubviews() {
    super.layoutSubviews()

    self.backgroundColor = .clear
    self.layer.masksToBounds = false

    let radius: CGFloat = 30


    if shadowLayer == nil {
        shadowLayer = CAShapeLayer()
        shadowLayer.path = UIBezierPath(roundedRect: bounds, byRoundingCorners: [.topLeft , .topRight], cornerRadii: CGSize(width: radius, height: radius)).cgPath
// shadowLayer.path = UIBezierPath(roundedRect: CGRect(x: bounds.origin.x, y: bounds.origin.y, width: bounds.width, height: bounds.height), byRoundingCorners: [.topLeft , .topRight], cornerRadii: CGSize(width: radius, height: radius)).cgPath // To change the shadow shape
        shadowLayer.fillColor = UIColor.white.cgColor

        shadowLayer.shadowColor = UIColor.lightGray.cgColor
        shadowLayer.shadowPath = shadowLayer.path
        shadowLayer.shadowOffset = CGSize(width: 0, height: -2.0)
        shadowLayer.shadowOpacity = 0.1
        shadowLayer.shadowRadius = 4

        layer.insertSublayer(shadowLayer, at: 0)
    }
}

К сожалению, это скрывает только верхние углы, но они по-прежнему нажимаемы, если View - кнопка.

...