Градиент тени 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.