należy stosować następujące biblioteki:
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];
Zrobiłem co w mojej mocy, aby przekonwertować rozszerzenie biblioteki na Swift (nie zostało to przetestowane, więc nie mogę zagwarantować, że zadziała). Powinno ci to jednak pomóc.
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
}
}
Zajęło mi to 2 sekundy: https://github.com/inamiy/YIInnerShadowView – Arbitur
@gotnull Znalazłem to pytanie, jednak nie mogłem wymyślić, jak dodać go tylko do góry. Również Arbitur, twój link jest w celu-c, którego nie mogłem przetłumaczyć. W swojej odpowiedzi SO wygląda dość skomplikowany fragment kodu i wszystkie jego strony. Nie używa też czegoś łatwego, jak "CGSizeMake", dlatego chciałem zapytać o to. Po prostu szukałem bardziej Swiftnej drogi – senty
Jeśli chcesz mieć pewność, że cień pozostaje tylko wzdłuż górnej granicy, bez względu na promień/przesunięcie rozmycia/itp.i nie wkracza w inne granice, najlepiej jest dodać "UIImageView" jako widok podrzędny, przywiązany do górnej granicy i rozciągający się na całej szerokości. Jeśli potrzebujesz specjalnej obróbki na krawędziach bocznych (jak sugeruje twój zrzut ekranu), być może rozciągliwy obraz z wypustkami zrobi wszystko. –