Wie erstelle ich einen Schatten unter einem UIView?
Ich versuche zu zeichnen, ein Schatten unter der unteren Kante der UIView
in Cocoa Touch. Ich verstehe, dass ich verwenden soll CGContextSetShadow()
zeichnen Sie die Schatten, aber die Quartz 2D programming guide ist ein wenig vage:
- Speichern Sie die Grafiken Zustand.
- Aufruf der Funktion
CGContextSetShadow
, übergeben die entsprechenden Werte. - Führen Sie die Zeichnung, auf die Sie sich bewerben möchten Schatten.
- Die Grafiken wiederherzustellen Staat
Habe ich versucht, das folgende in einen UIView
Unterklasse:
- (void)drawRect:(CGRect)rect {
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSaveGState(currentContext);
CGContextSetShadow(currentContext, CGSizeMake(-15, 20), 5);
CGContextRestoreGState(currentContext);
[super drawRect: rect];
}
..aber das funktioniert nicht für mich und ich bin ein bisschen stecken über (a), wo Sie als Nächstes gehen und (b) wenn es etwas gibt, was muss ich tun, um meine UIView
diese Arbeit zu machen?
InformationsquelleAutor Fraser Speirs | 2009-04-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Ihrer aktuellen code haben, speichern Sie die
GState
dem aktuellen Kontext, konfigurieren, ziehen Sie ein Schatten .. und das wiederherstellen, was es war, bevor Sie es konfiguriert, um zu zeichnen ein Schatten. Dann, endlich, rufen Sie die Oberklasse der Implementierung desdrawRect
: .Jede Zeichnung, sollten betroffene durch die Schatten-Einstellung passieren muss, um die nachdem
aber, bevor
Also, wenn Sie wollen, dass die Superklasse die
drawRect:
'verpackt' in einem Schatten, dann wie wärs, wenn du die Reihenfolge der code so?InformationsquelleAutor Christian Brunschen
Durch eine weitaus einfachere Methode ist, um einige layer-Attribute der Blick auf die Initialisierung:
Müssen Sie es importieren QuartzCore.
Diese Lösung erfordert auch das hinzufügen
#import <QuartzCore/QuartzCore.h>"
.h-Datei.Einstellung
masksToBounds
zuNO
negiert wirdcornerRadius
keine?Okay, um das zu beheben, wird die Hintergrundfarbe eingestellt werden muss, auf die Ebene und die Ansicht muss transparent sein.
Wie machst du das? Ich habe versucht
self.layer.backgroundColor = [[UIColor whiteColor] CGColor];
aber kein Glück. Welche Ansicht muss transparent sein?InformationsquelleAutor ollie
Dies verlangsamt die Anwendung.
Das hinzufügen der folgenden Zeile kann die Leistung verbessern, so lange, wie Sie Ihre Ansicht ist sichtbar eckig:
selbst.Schicht.shadowPath... anstatt was? oder nur das hinzufügen, um es
Nur hinzufügen, dass extra Linie neben der anderen.
Zeichnung Schatten ist teurer Vorgang ist, so zum Beispiel, wenn Ihre Anwendung ermöglicht andere interface-Orientierung, und Sie beginnen, um das Gerät zu drehen, ohne dass explizit der Pfad der Schatten es gerendert werden muss, mehrere Male während dieser animation, die, je nach der Form, wohl sichtlich verlangsamen die animation
Dass insbesondere die Zeile funktioniert nur für Rechtecke, aber Sie können auch nicht-rechteckige Pfade. Zum Beispiel, wenn Sie ein abgerundetes Rechteck, das Sie verwenden können, bezierPathWithRoundedRect:cornerRadius:
InformationsquelleAutor ZYiOS
Gleiche Lösung, aber nur, um Sie daran erinnern: Sie können definieren, der Schatten direkt in das storyboard.
Ex:
nur definieren Sie die Kategorie
UIView
oderCGLayer
was ist einUIColor
wrapper für dieCGColor
Eigenschaft 😉Dieser link beschreibt, wie Sie dies tun: cocoadventures.org/post/104137872754/...
Um es einfacher für die Menschen zu kopieren und einfügen: Schicht.masksToBound, Schicht.shadowOffset, Schicht.shadowRadius, Schicht.shadowOpacity. Tippfehler werden dich töten, hier.
Schicht.shadowOpacity Wert 0.5 nicht 0,5
InformationsquelleAutor Antzi
Können Sie versuchen, diese .... Sie können spielen mit den Werten.
Die
shadowRadius
bestimmt die Intensität der Unschärfe.shadowOffset
diktiert, wo die Schatten geht.InformationsquelleAutor O-mkar
Einfache und saubere Lösung, die mit Interface Builder
Fügen Sie eine Datei namens UIView.swift in Ihrem Projekt (oder fügen Sie diesen in eine Datei) :
Dann wird dies im Interface Builder für jede Ansicht in der "Utilities Panel" > Attribute Inspector :
Können Sie leicht die Schatten jetzt.
Hinweise:
- Der Schatten erscheint nicht in der IB, nur zur Laufzeit.
- Als Mazen Kasser sagte
Diese Lösung führt mich zu einer nicht arbeiten Verhalten mit der folgenden Warnmeldung (eine für jede Eigenschaft) :
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.
Ich hatte zu importieren
UIKit
machen, damit es funktioniert, sind die grundlegendenFoundation
importieren erstellt von XCode ist nicht genug, die Kompilierung ist jedoch in Ordnung. Ich hätte kopiert den gesamten Quellcode. Danke Axel für diese schöne Lösung.InformationsquelleAutor Axel Guilmin
Ich diese als Teil meiner utils. Mit diesem können wir nicht nur Schatten, sondern kann auch erhalten eine abgerundete Ecke, für alle
UIView
. Auch können Sie einstellen, welche Farbe der Schatten, die Sie bevorzugen. Normalerweise ist schwarz bevorzugt, aber manchmal, wenn der hintergrund nicht weiß, möchten Sie vielleicht etwas anderes. Hier ist, was ich verwenden -Diese zu verwenden, müssen wir dieses, nennen
[utils roundedLayer:yourview.layer radius:5.0f shadow:YES];
InformationsquelleAutor Srikar Appalaraju
Swift 3
Es nicht geben wird, mit abgerundeten Ecken, um mich, mache ich etwas falsch?
nichts passiert, das könnte sein, weil die Funktion
installShadow()
wird nicht aufgerufen vonviewDidLoad()
oderviewWillAppear()
Ich war der Aufruf von überladenen
draw
Methode anzeigen. Schatten kommt richtig, aber abgerundete Ecke nicht.keine abgerundete Rahmen, dies könnte sein, da die Ansicht eine
UIStackView
die nur tut, layout und hat keine Aussicht. Sie können, müssen Sie eine regelmäßigeUIView
als container für alles.InformationsquelleAutor neoneye
Für diejenigen, die nicht bekommen diese arbeiten (Wie mich!) nach dem Versuch all die Antworten hier, so stellen Sie sicher, dass Clip Untersichten ist nicht aktiviert bei den Attributes inspector...
InformationsquelleAutor Mazen Kasser
Wenn Sie möchten, verwenden Sie StoryBoard und würde gerne weiter Tippen, in der runtime-Attribute, können Sie ganz einfach erstellen Sie eine Erweiterung zu sichten und nutzbar zu machen im storyboard.
Schritt 1. Erweiterung anlegen
Schritt 2. jetzt können Sie diese Attribute in der storyboard -
InformationsquelleAutor king_T
Können Sie eigene utility-Funktion erstellt für Schatten und Ecke radius als unten:
Hoffe, es wird dir helfen!!!
InformationsquelleAutor Sandip Patel - SM
Alle Antworten sind alle gut, aber ich möchte hinzufügen, ein weiterer Punkt
Wenn Sie auf ein problem stoßen, wenn Sie Zellen in einer Tabelle, Deque eine neue Zelle besteht eine Diskrepanz im Schatten, also in diesem Fall, Sie benötigen, um Ihre Schatten-code in einer Methode layoutSubviews, so dass es verhält sich gut in allen Bedingungen.
oder in ViewControllers für bestimmte Perspektive auf die Stelle, shadow-code, der in die folgende Methode, so dass es seine Arbeit gut
Habe ich geändert mein Schatten-Implementierung für neue Entwickler für mehr verallgemeinerte form ex:
InformationsquelleAutor Vishal16
Für andere Xamarians, die Xamarin.iOS - /C# - version der Antwort würde wie folgt Aussehen:
Der Hauptunterschied ist, dass Sie erwerben eine Instanz von
CGContext
auf die Sie direkt aufrufen der entsprechenden Methoden.InformationsquelleAutor Martin Zikmund
Swift 3
InformationsquelleAutor Josh O'Connor