Ich versuche, einen Schatten unter den unteren Rand eines UIView
in Cocoa Touch zu zeichnen . Ich verstehe, dass ich CGContextSetShadow()
den Schatten zeichnen sollte , aber die 2D-Programmieranleitung für Quarz ist etwas vage:
- Speichern Sie den Grafikstatus.
- Rufen Sie die Funktion auf
CGContextSetShadow
und übergeben Sie die entsprechenden Werte. - Führen Sie alle Zeichnungen aus, auf die Sie Schatten anwenden möchten.
- Stellen Sie den Grafikstatus wieder her
Ich habe Folgendes in einer UIView
Unterklasse versucht :
- (void)drawRect:(CGRect)rect {
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSaveGState(currentContext);
CGContextSetShadow(currentContext, CGSizeMake(-15, 20), 5);
CGContextRestoreGState(currentContext);
[super drawRect: rect];
}
..aber das funktioniert bei mir nicht und ich bin ein bisschen festgefahren, (a) wohin ich als nächstes gehen soll und (b) ob ich irgendetwas tun muss UIView
, damit dies funktioniert?
quelle
#import <QuartzCore/QuartzCore.h>"
zur .h-Datei.masksToBounds
aufNO
wird das negierencornerRadius
, nein?self.layer.backgroundColor = [[UIColor whiteColor] CGColor];
aber kein Glück. Welche Ansicht muss transparent sein?Dies verlangsamt die Anwendung. Durch Hinzufügen der folgenden Zeile kann die Leistung verbessert werden, solange Ihre Ansicht sichtbar rechteckig ist:
quelle
Gleiche Lösung, aber nur zur Erinnerung: Sie können den Schatten direkt im Storyboard definieren.
Ex:
quelle
UIView
oderCGLayer
die einUIColor
Wrapper für dieCGColor
Eigenschaft ist;)Sie können dies versuchen ... Sie können mit den Werten spielen. Das bestimmt
shadowRadius
die Menge der Unschärfe.shadowOffset
diktiert, wohin der Schatten geht.quelle
Einfache und saubere Lösung mit Interface Builder
Fügen Sie Ihrem Projekt eine Datei mit dem Namen UIView.swift hinzu (oder fügen Sie diese einfach in eine beliebige Datei ein):
Dies ist dann im Interface Builder für jede Ansicht im Dienstprogrammfenster> Attributinspektor verfügbar:
Sie können den Schatten jetzt einfach einstellen.
Hinweise:
- Der Schatten wird in IB nur zur Laufzeit nicht angezeigt.
- Wie Mazen Kasser sagte
quelle
Failed to set (shadowColor) user defined inspected property on (UICollectionViewCell): [<UICollectionViewCell> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key shadowColor.
UIKit
, damit es funktioniert. DerFoundation
von XCode erstellte Basisimport reicht nicht aus, lässt sich aber gut kompilieren. Ich hätte den gesamten Quellcode kopieren sollen. Vielen Dank an Axel für diese schöne Lösung.Ich benutze dies als Teil meiner Utensilien. Damit können wir nicht nur Schatten setzen, sondern auch für jeden eine abgerundete Ecke bekommen
UIView
. Sie können auch festlegen, welchen Farbschatten Sie bevorzugen. Normalerweise wird Schwarz bevorzugt, aber manchmal, wenn der Hintergrund nicht weiß ist, möchten Sie vielleicht etwas anderes. Folgendes benutze ich:Um dies zu nutzen, müssen wir dies nennen -
[utils roundedLayer:yourview.layer radius:5.0f shadow:YES];
quelle
Swift 3
quelle
installShadow()
nicht vonviewDidLoad()
oderviewWillAppear()
draw
Sichtmethode aufgerufen. Der Schatten kommt richtig, die abgerundete Ecke jedoch nicht.UIStackView
nur Layout ist und keine Ansicht hat. Möglicherweise müssen SieUIView
für alles einen regulären als Container einfügen .Wenn Sie StoryBoard verwenden möchten und keine Laufzeitattribute mehr eingeben möchten, können Sie ganz einfach eine Erweiterung für Ansichten erstellen und diese im Storyboard verwenden.
Schritt 1. Erstellen Sie eine Erweiterung
Schritt 2. Sie können diese Attribute jetzt im Storyboard verwenden
quelle
Für diejenigen, die dies nicht zum Laufen gebracht haben (wie ich selbst!), Nachdem sie alle Antworten hier ausprobiert haben, stellen Sie einfach sicher, dass die Clip-Unteransichten im Attributinspektor nicht aktiviert sind ...
quelle
Swift 3
quelle
Sie können meine Dienstprogrammfunktion, die für Schatten und Eckenradius erstellt wurde, wie folgt verwenden:
Hoffe es wird dir helfen !!!
quelle
Alle Beantworten Sie alle gut, aber ich möchte noch einen Punkt hinzufügen
Wenn Sie bei Tabellenzellen auf ein Problem stoßen, entfernen Sie eine neue Zelle, da der Schatten nicht übereinstimmt. In diesem Fall müssen Sie Ihren Schattencode in eine layoutSubviews-Methode einfügen, damit er sich unter allen Bedingungen gut verhält.
oder platzieren Sie in ViewControllers für eine bestimmte Ansicht Schattencode in der folgenden Methode, damit er gut funktioniert
Ich habe meine Schattenimplementierung für neue Entwickler für eine allgemeinere Form geändert, z.
quelle
Für andere Xamarians würde die Xamarin.iOS / C # -Version der Antwort wie folgt aussehen:
Der Hauptunterschied besteht darin, dass Sie eine Instanz erwerben, für
CGContext
die Sie die entsprechenden Methoden direkt aufrufen.quelle
Sie können dies verwenden
Extension
, um Schatten hinzuzufügenman kann es so nennen
quelle
Skizzenschatten mit IBDesignable und IBInspectable in Swift 4
quelle