Используйте следующую библиотеку:
https://github.com/nlampi/UIView-InnerShadow
// Add a shadow to the top of the view only
[exampleView addInnerShadowWithRadius:3.0f
andColor:[UIColor colorWithWhite:0 alpha:0.45f]
inDirection:NLInnerShadowDirectionTop];
Я сделал все возможное, чтобы преобразовать расширение библиотеки в Swift (это непроверено, поэтому я не могу гарантировать, что он будет работать). Тем не менее, это должно сделать вас на правильном пути.
import UIKit
extension UIView {
struct NLInnerShadowDirection: OptionSetType {
let rawValue: Int
static let None = NLInnerShadowDirection(rawValue: 0)
static let Left = NLInnerShadowDirection(rawValue: 1 << 0)
static let Right = NLInnerShadowDirection(rawValue: 1 << 1)
static let Top = NLInnerShadowDirection(rawValue: 1 << 2)
static let Bottom = NLInnerShadowDirection(rawValue: 1 << 3)
static let All = NLInnerShadowDirection(rawValue: 15)
}
func removeInnerShadow() {
for view in self.subviews {
if (view.tag == 2639) {
view.removeFromSuperview()
break
}
}
}
func addInnerShadow() {
let c = UIColor()
let color = c.colorWithAlphaComponent(0.5)
self.addInnerShadowWithRadius(3.0, color: color, inDirection: NLInnerShadowDirection.All)
}
func addInnerShadowWithRadius(radius: CGFloat, andAlpha: CGFloat) {
let c = UIColor()
let color = c.colorWithAlphaComponent(alpha)
self.addInnerShadowWithRadius(radius, color: color, inDirection: NLInnerShadowDirection.All)
}
func addInnerShadowWithRadius(radius: CGFloat, andColor: UIColor) {
self.addInnerShadowWithRadius(radius, color: andColor, inDirection: NLInnerShadowDirection.All)
}
func addInnerShadowWithRadius(radius: CGFloat, color: UIColor, inDirection: NLInnerShadowDirection) {
self.removeInnerShadow()
let shadowView = self.createShadowViewWithRadius(radius, andColor: color, direction: inDirection)
self.addSubview(shadowView)
}
func createShadowViewWithRadius(radius: CGFloat, andColor: UIColor, direction: NLInnerShadowDirection) -> UIView {
let shadowView = UIView(frame: CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height))
shadowView.backgroundColor = UIColor.clearColor()
shadowView.tag = 2639
let colorsArray: Array = [ andColor.CGColor, UIColor.clearColor().CGColor ]
if direction.contains(.Top) {
let xOffset: CGFloat = 0.0
let topWidth = self.bounds.size.width
let shadow = CAGradientLayer()
shadow.colors = colorsArray
shadow.startPoint = CGPointMake(0.5, 0.0)
shadow.endPoint = CGPointMake(0.5, 1.0)
shadow.frame = CGRectMake(xOffset, 0, topWidth, radius)
shadowView.layer.insertSublayer(shadow, atIndex: 0)
}
if direction.contains(.Bottom) {
let xOffset: CGFloat = 0.0
let bottomWidth = self.bounds.size.width
let shadow = CAGradientLayer()
shadow.colors = colorsArray
shadow.startPoint = CGPointMake(0.5, 1.0)
shadow.endPoint = CGPointMake(0.5, 0.0)
shadow.frame = CGRectMake(xOffset, self.bounds.size.height - radius, bottomWidth, radius)
shadowView.layer.insertSublayer(shadow, atIndex: 0)
}
if direction.contains(.Left) {
let yOffset: CGFloat = 0.0
let leftHeight = self.bounds.size.height
let shadow = CAGradientLayer()
shadow.colors = colorsArray
shadow.frame = CGRectMake(0, yOffset, radius, leftHeight)
shadow.startPoint = CGPointMake(0.0, 0.5)
shadow.endPoint = CGPointMake(1.0, 0.5)
shadowView.layer.insertSublayer(shadow, atIndex: 0)
}
if direction.contains(.Right) {
let yOffset: CGFloat = 0.0
let rightHeight = self.bounds.size.height
let shadow = CAGradientLayer()
shadow.colors = colorsArray
shadow.frame = CGRectMake(self.bounds.size.width - radius, yOffset, radius, rightHeight)
shadow.startPoint = CGPointMake(1.0, 0.5)
shadow.endPoint = CGPointMake(0.0, 0.5)
shadowView.layer.insertSublayer(shadow, atIndex: 0)
}
return shadowView
}
}
Взял меня 2 секунды: https://github.com/inamiy/YIInnerShadowView – Arbitur
@gotnull Я нашел этот вопрос, однако я не мог понять, как добавить его только сверху. Кроме того, Arbitur, ваша ссылка в объективе-c, которую я не мог перевести. В своем SO-ответе он выглядит довольно сложным куском кода и всех его сторон. Он также не использует что-то простое, как 'CGSizeMake', поэтому я хотел спросить об этом. Я просто искал более Swifty way – senty
Если вы хотите, чтобы тень оставалась только вдоль верхней границы, независимо от размытия/смещения размытия и т. Д.и не будет кровоточить в другие границы, лучше всего добавить «UIImageView» в качестве детского вида, прикрепленного к верхней границе и растянувшегося по всей ширине. Если вам нужно специальное лечение на боковых краях (как кажется, кажется, ваш скриншот), возможно, растягиваемое изображение с вставками сделает трюк. –