Verwenden folgende Bibliothek:
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];
Ich habe mein Bestes getan, um die Bibliothekserweiterung in Swift umzuwandeln (dies ist nicht getestet, daher kann ich nicht garantieren, dass es funktioniert). Es sollte dich aber auf die richtige Spur bringen.
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
}
}
dauerte 2 Sekunden: https://github.com/inamiy/YIInnerShadowView – Arbitur
@gotnull Ich habe diese Frage gefunden, aber ich konnte nicht herausfinden, wie man es nur oben hinzufügen. Auch Arbitur, dein Link ist in objective-c, den ich nicht übersetzen konnte. In seiner SO-Antwort sieht es ziemlich kompliziertes Stück Code und all seine Seiten aus. Es benutzt auch nicht so einfach wie 'CGSizeMake', deshalb wollte ich danach fragen. Ich war nur auf der Suche nach einem Swifty Weg – senty
Wenn Sie sicherstellen möchten, dass der Schatten nur entlang des oberen Randes bleibt, unabhängig vom Weichzeichnerradius/Offset/etc.und blutet nicht in die anderen Grenzen. Am besten ist es, wenn Sie eine "UIImageView" als untergeordnete Ansicht hinzufügen, die an der oberen Grenze befestigt ist und sich über die gesamte Breite erstreckt. Wenn Sie eine spezielle Behandlung an den Seitenrändern benötigen (wie Ihr Screenshot zu suggerieren scheint), wird vielleicht ein dehnbares Bild mit Einsätzen den Zweck erfüllen. –