Градиент тени UIView

Я создал пользовательский UIView в моем проекте iOS, у которого есть тень. Моя цель - применить тот же градиент к тени, что и на фоне представления.

Ниже приведен пример того, как выглядят мои текущие сплошные цветовые тени.

Теневой пример Это делается через подкласс UIView с приведенным ниже кодом:

override func layoutSubviews() {
    let gradientLayer = layer as! CAGradientLayer
    gradientLayer.colors = [topColor.cgColor, bottomColor.cgColor]
    gradientLayer.startPoint = CGPoint(x: startPointX, y: startPointY)
    gradientLayer.endPoint = CGPoint(x: endPointX, y: endPointY)
    layer.cornerRadius = cornerRadius
    layer.shadowColor = shadowColor.cgColor
    layer.shadowOffset = CGSize(width: shadowX, height: shadowY)
    layer.shadowRadius = shadowBlur
    layer.shadowOpacity = 1

    let inset: CGFloat = bounds.width * 0.05
    layer.shadowPath = UIBezierPath(roundedRect: bounds.insetBy(dx: inset, dy: 0.0), cornerRadius: cornerRadius).cgPath
}

Я играю вокруг, создавая второй слой градиента и маскируя его в тень, но не повезло. Пожалуйста, укажите мне в правильном направлении!

Ответы

Ответ 1

Я думаю, что вы не можете сделать больше со стандартной теней CALayer. Посмотрите на свойство фильтров CALayer.

https://developer.apple.com/documentation/quartzcore/calayer/1410901-filters

Создайте второй CAGradientLayer и примените фильтр GausianBlur, например.

https://developer.apple.com/library/content/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIGaussianBlur

Отключите стандартные тени слоя и добавьте размытый слой в качестве подслоя.

Ответ 2

Я считаю, что @jacek прав, вы нажимаете предел того, что вы можете делать с тенями CALayer (что не так уж и важно)

Лучшие вещи, которые нужно сделать, как объясняет яцек, - создать вашу собственную тень, хотя другой CAGradientLayer применяет размытие Гаусса, чтобы действовать как тень.

Кроме того, я не считаю, что размещение кода внутри layoutSubviews является наиболее подходящим местом. После настройки ваш слой не должен сильно меняться, и, следовательно, его много будет называть, если ваш макет сильно изменится.

Обычно, если вы используете представление, исходящее из интерфейса-построителя, я бы назвал эту логику от awakeFromNib внутри выделенной функции configureBackgroundViews, например.

Ответ 3

Используйте мой код для ваших требований, доступных в моем gitRepo https://github.com/Krishnarjun-Banoth/BlurView/tree/master/Shadows

Шаг 1: просто перетащите в свой проект файл BlurEffect.swift.

Шаг 2: Затем просто используйте ниже. Просмотрите методы расширения для каждого из ваших представлений индивидуально.

  testView.applyGradient(colours: [UIColor.blue,UIColor.orange]) //pass your required colours.
  testView.blur(blurRadius: 5.0)

Примечание: Вдохновленный от ответа @Jacek Głazik и учебник по FlexMonkey.