Комплексное руководство: добавление теней в определенные углы UIView в Swift 6

В этой статье мы рассмотрим различные методы добавления теней в определенные углы UIView в Swift 6. Тени могут повысить визуальную привлекательность пользовательских интерфейсов и обеспечить ощущение глубины. Мы рассмотрим несколько методов с примерами кода для достижения этого эффекта, гарантируя, что у вас будет несколько вариантов выбора в зависимости от ваших конкретных требований.

Метод 1: использование CALayer и UIBezierPath

extension UIView {
    func addShadowToSpecificCorners(corners: UIRectCorner, shadowColor: UIColor, shadowRadius: CGFloat, shadowOpacity: Float) {
        let shadowLayer = CAShapeLayer()
        shadowLayer.path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: 10, height: 10)).cgPath
        shadowLayer.fillColor = backgroundColor?.cgColor
        shadowLayer.shadowColor = shadowColor.cgColor
        shadowLayer.shadowPath = shadowLayer.path
        shadowLayer.shadowOffset = CGSize(width: 0, height: 0)
        shadowLayer.shadowOpacity = shadowOpacity
        shadowLayer.shadowRadius = shadowRadius
        layer.addSublayer(shadowLayer)
    }
}

Метод 2: использование ShadowOffset и ShadowPath

extension UIView {
    func addShadowToSpecificCorner(corner: UIRectCorner, shadowColor: UIColor, shadowRadius: CGFloat, shadowOpacity: Float) {
        let shadowLayer = CALayer()
        shadowLayer.shadowColor = shadowColor.cgColor
        shadowLayer.shadowOffset = CGSize(width: 0, height: 0)
        shadowLayer.shadowOpacity = shadowOpacity
        shadowLayer.shadowRadius = shadowRadius
        let cornerPath = UIBezierPath(roundedRect: bounds, byRoundingCorners: corner, cornerRadii: CGSize(width: 10, height: 10))
        shadowLayer.shadowPath = cornerPath.cgPath
        layer.insertSublayer(shadowLayer, at: 0)
    }
}

Метод 3. Применение тени с помощью маски и CAGradientLayer

extension UIView {
    func addShadowToSpecificCorners(corners: UIRectCorner, shadowColor: UIColor, shadowRadius: CGFloat, shadowOpacity: Float) {
        let shadowLayer = CAGradientLayer()
        shadowLayer.colors = [UIColor.clear.cgColor, shadowColor.cgColor]
        shadowLayer.locations = [0, 1]
        shadowLayer.startPoint = CGPoint(x: 0, y: 0)
        shadowLayer.endPoint = CGPoint(x: 0, y: 1)
        shadowLayer.frame = bounds
        let cornerPath = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: 10, height: 10))
        let maskLayer = CAShapeLayer()
        maskLayer.path = cornerPath.cgPath
        shadowLayer.mask = maskLayer
        layer.insertSublayer(shadowLayer, at: 0)
    }
}

Метод 4: использованиеshadowImage и resizableImage

extension UIView {
    func addShadowToSpecificCorner(corner: UIRectCorner, shadowColor: UIColor, shadowRadius: CGFloat, shadowOpacity: Float) {
        let shadowImage = UIImage(named: "shadowImage")?.resizableImage(withCapInsets: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10), resizingMode: .stretch)
        let shadowImageView = UIImageView(image: shadowImage)
        shadowImageView.frame = bounds
        shadowImageView.contentMode = .scaleToFill
        shadowImageView.layer.cornerRadius = 10
        shadowImageView.layer.maskedCorners = CACornerMask(rawValue: corner.rawValue)
        shadowImageView.layer.masksToBounds = true
        shadowImageView.layer.shadowColor = shadowColor.cgColor
        shadowImageView.layer.shadowOffset = CGSize(width: 0, height: 0)
        shadowImageView.layer.shadowOpacity = shadowOpacity
        shadowImageView.layer.shadowRadius = shadowRadius
        addSubview(shadowImageView)
        sendSubviewToBack(shadowImageView)
    }
}

В этой статье мы рассмотрели несколько методов добавления теней в определенные углы UIView в Swift 6. Каждый метод предлагает свой собственный подход и уровень настройки. Используя CALayer, UIBezierPath, CAGradientLayer иshadowImage, вы можете добиться различных теневых эффектов для улучшения визуальной эстетики ваших пользовательских интерфейсов. Поэкспериментируйте с этими методами и выберите тот, который лучше всего соответствует требованиям вашего проекта.