теневой слой выходит за границы в ячейке таблицы

Я пытаюсь добавить тень к представлению. В настоящее время у меня есть кнопка и UIView, где UIView находится за кнопкой с тем же фреймом, что и кнопка. Ограничения для UIView — это [верхняя, нижняя, ведущая, конечная] кнопки.

Код для добавления тени выглядит следующим образом:

func applySketchShadow(color: UIColor = .black, alpha: Float = 0.5,
    x: CGFloat = 0, y: CGFloat = 2, blur: CGFloat = 4, spread: CGFloat = 0, bgColor: UIColor = .white){

    let shadowLayer = CAShapeLayer()
    shadowLayer.path = UIBezierPath(roundedRect: bounds, cornerRadius: self.bounds.height/2).cgPath
    shadowLayer.fillColor = bgColor.cgColor
    shadowLayer.shadowColor = color.cgColor
    if spread == 0 {
        shadowPath = nil
    } else {
        let dx = -spread
        let rect = bounds.insetBy(dx: dx, dy: dx)
        shadowPath = UIBezierPath(rect: rect).cgPath
    }
    shadowLayer.shadowOffset = CGSize(width: x, height: y)
    shadowLayer.shadowOpacity = alpha
    shadowLayer.shadowRadius = blur / 2.0

    self.insertSublayer(shadowLayer, at: 0)
    self.layoutIfNeeded()
    self.setNeedsLayout()

}

Я вызываю этот код в ячейке tableview, которая имеет вышеупомянутую кнопку и представление. Код, в котором я вызываю функцию ячейки таблицы, выглядит следующим образом:

расширение GradientButtonCell{

func initCell(topColor : UIColor , bottomColor : UIColor , text : String , orientation : GradientOrientation , textColor : UIColor){

    self.gradientButton.applyGradient(
        withColours: [topColor , bottomColor],
        gradientOrientation: orientation
    )
    self.gradientButton.setTitleColor(textColor, for: .normal)
    self.gradientButton.setTitle(text, for: .normal)
    self.gradientButton.titleLabel?.font = UIFont().nexaBold(withSize: 14.0)
    self.gradientButton.layer.masksToBounds = true
    self.gradientButton.layer.cornerRadius = self.gradientButton.frame.height/2
    self.shadowView.layer.applySketchShadow(
        color: UIColor.hotPink60,
        alpha: 0.6,
        x: 0,
        y: 2,
        blur: 15,
        spread: -20
    )

}

}

Но по какой-то причине теневой слой продолжает выходить за границы, как показано на изображении.

белый слой выходит за пределы UIView за кнопкой

Любая идея о том, как это исправить, приветствуется.


person ashin asok    schedule 21.12.2019    source источник


Ответы (1)


Добавьте это расширение UIView:

extension UIView {
    func addShadow(
        backgroundColor: UIColor = .white,
        cornerRadius: CGFloat = 5,
        shadowOpacity: Float = 1,
        shadowRadius: CGFloat = 2,
        shadowColor: UIColor = .lightGray,
        shadowOffset: CGSize = CGSize(width: 1, height: 1)
    ) {
        self.backgroundColor = backgroundColor
        self.layer.masksToBounds = false
        self.layer.cornerRadius = cornerRadius
        self.layer.shadowOpacity = shadowOpacity
        self.layer.shadowRadius = shadowRadius
        self.layer.shadowColor = shadowColor.cgColor
        self.layer.shadowOffset = shadowOffset
    }
}

Затем попробуйте вызвать что-то вроде этого

self.shadowView.addShadow(
    backgroundColor: .blue,
    cornerRadius: 10,
    shadowOpacity: 0.7,
    shadowRadius: 5,
    shadowColor: .lightGray,
    shadowOffset: .zero
)
person talha_kuet    schedule 21.12.2019
comment
есть ли возможность добавить градиент вместо цвета фона? - person ashin asok; 21.12.2019
comment
Попробуйте вызвать свой метод applySketchShadow из метода layoutIfNeeded() вашего пользовательского UITableViewCell. - person talha_kuet; 21.12.2019