Ich möchte eine benutzerdefinierte UIView
...: Ich wollte nur eine leere weiße Ansicht mit abgerundeten Ecken und einem hellen Schlagschatten (ohne Lichteffekt). Ich kann durch ein jedes dieser ein tun , aber die üblichen clipToBounds
/ maskToBounds
Konflikte auftreten.
iphone
ios
cocoa-touch
uiview
rounded-corners
Aditya Vaidyam
quelle
quelle
Antworten:
Der folgende Code - Schnipsel fügt eine Grenze, Grenzradius und Schlagschatten
v
, einUIView
:Sie können die Einstellungen an Ihre Bedürfnisse anpassen.
Fügen Sie Ihrem Projekt außerdem das QuartzCore-Framework hinzu und:
Siehe meine andere Antwort bezüglich
masksToBounds
.Hinweis
Dies funktioniert möglicherweise nicht in allen Fällen. Wenn Sie feststellen, dass diese Methode andere von Ihnen ausgeführte Zeichenvorgänge beeinträchtigt, lesen Sie bitte diese Antwort .
quelle
Schnell
Erkundung der Optionen
Problem 1: Der Schatten wird abgeschnitten
Was ist, wenn es Unterschichten oder Unteransichten (wie ein Bild) gibt, deren Inhalt wir an die Grenzen unserer Ansicht kürzen möchten?
Wir können dies mit erreichen
(Alternativ
blueView.clipsToBounds = true
ergibt sich das gleiche Ergebnis .)Aber oh nein! Der Schatten wurde auch abgeschnitten, weil er außerhalb der Grenzen liegt! Was ist zu tun? Was ist zu tun?
Lösung
Verwenden Sie separate Ansichten für den Schatten und den Rand. Die Basisansicht ist transparent und hat den Schatten. In der Rahmenansicht werden alle anderen Unterinhalte, die an den Rändern vorhanden sind, abgeschnitten.
Dies ergibt das folgende Ergebnis:
Problem 2: Schlechte Leistung
Das Hinzufügen abgerundeter Ecken und Schatten kann ein Leistungseinbruch sein. Sie können die Leistung verbessern, indem Sie einen vordefinierten Pfad für den Schatten verwenden und angeben, dass er gerastert werden soll. Der folgende Code kann dem obigen Beispiel hinzugefügt werden.
Weitere Informationen finden Sie in diesem Beitrag . Siehe hier und hier auch.
Diese Antwort wurde mit Swift 4 und Xcode 9 getestet.
quelle
baseView.backgroundColor = UIColor.clear
entfernt den Schatten. Nur wenn Sie eine Hintergrundfarbe festlegen, wird diese angezeigt.Eine Möglichkeit, dies zu tun, besteht darin, die Ansicht mit abgerundeten Ecken in eine Ansicht mit dem Schlagschatten zu setzen.
Dann können Sie die shadowView hinzufügen, wo immer Sie möchten.
quelle
Schauen Sie sich das Beispielprojekt auf GitHub an, um sicherzustellen, dass Sie die Komponente korrekt verwenden.
Einfache Swift 5-Lösung ohne zusätzliche Unteransichten oder Unterklassen:
Beachten Sie, dass Sie Ihre Ansicht vor dem Aufruf mit dem Eckenradius und anderen Eigenschaften einrichten sollten
addShadow
.Nennen Sie das danach einfach
viewDidLoad
so:Endergebnis:
Super einfach und unkompliziert!
quelle
layer.shadowPath = UIBezierPath.init(roundedRect: layer.bounds, cornerRadius: layer.cornerRadius).cgPath
. Kann nicht erklären warum, hat jemand eine Erklärung dafür?Das hat bei mir funktioniert. Der Trick bestand darin, die Hintergrundfarbe von der Hauptansicht auf die Ebene zu verschieben.
quelle
UIView extension
- stackoverflow.com/a/43295741/1313939 Vielen Dank für die Inspiration!Ich habe das Problem mit dem folgenden Trick gelöst, als ich der Containeransicht einen Schattenpfad zugewiesen habe:
Beachten Sie, dass der Pfad zum Schatten ein abgerundetes Rechteck mit demselben Eckenradius wie der Hintergrund ist, den die Zelle enthält:
quelle
Wenn Sie wegen des gerundeten
corners
vs.subviews
vs. kämpfenmasksToBounds
, versuchen Sie, meine Funktion zu verwenden:Nennen Sie es aus Ihrer Sicht. Ob Ihre Ansicht abgerundete Ecken hat, unabhängig von ihrer Größe, ihrer Form - es wird ein schöner Schatten gezeichnet.
Behalten Sie einfach den Rückgabewert der Funktion bei, damit Sie darauf verweisen können, wenn Sie die Tabelle entfernen (oder beispielsweise verwenden
insertSubview:aboveView:
) möchten.quelle
shadow.userInteractionEnabled = NO; // Modify this if needed
Linie? Dies ist also bei Bedarf der Fall.userInteractionEnabled
ist eine einfache und beliebte Eigenschaft, mit der Sie bereits vertraut sein sollten :-)Mit Swift 4 und Xcode 9 ist dies ein funktionierendes Beispiel für das Runden eines
ImageView
Schlagschattens und eines Rahmens.Wenn Sie möchten, dass das Bild kreisförmig ist: (und ohne Rand angezeigt wird)
quelle
Ich habe einen Helfer für UIView erstellt
Sie können es so nennen
Hier ist die Implementierung
quelle
Nach einem ganzen Tag Recherche der runden Eckansicht mit Schatten bin ich froh, meine benutzerdefinierte uiview-Klasse hier zu veröffentlichen, und hoffe, diese Frage zu beenden:
RoundCornerShadowView.h
RoundCornerShadowView.m
Sie müssen also KEINE Unteransicht in der Ansicht oder darunter in der Zielansicht hinzufügen. Fügen Sie einfach eine Ebene in der aktuellen Ansicht hinzu und führen Sie drei Schritte aus, um sie abzuschließen!
Schauen Sie sich die Kommentare im Code genau an, es ist hilfreich, die Komponente zu verstehen!
quelle
Etwas schnelles getestet in schnellem 4
Produziert
Wenn Sie es im Inspektor wie folgt aktivieren:
Das benutzerdefinierte Laufzeitattribut wird hinzugefügt, was zu Folgendem führt:
(Ich habe vorher das hinzugefügt
cornerRadius = 8
):) :)
quelle
Sie müssen verwenden
shadowView
und verwendenroundView
shadowView
roundView
shadowView
ein wenig nach innen zu legen , und der Schatten muss herausleuchten. Stellen Sie dasinsets
so ein, dassshadowView
es dahinter völlig unsichtbar istroundView
roundView
Der Code
Oder Sie können einfach unten ohne Angabe tun
clipToBounds/maskToBounds
quelle
Swift 3 & IBInspectable-Lösung: Inspiriert von Ades
Lösung
Erstellen Sie zunächst eine UIView-Erweiterung:
Wählen Sie dann einfach Ihre UIView im Interface Builder aus und stellen Sie Schatten EIN und Eckenradius wie folgt ein :
Das Ergebnis!
quelle
Hier ist die Lösung für das Konfliktproblem masksToBounds, das bei mir funktioniert.
Nachdem Sie corderRadius / borderColor / shadow usw. festgelegt haben, setzen Sie masksToBounds auf NO:
quelle
Schatten + Rand + Eckradius
quelle
Hier ist meine Version in Swift 3 für ein UIView
quelle
Swift 4: Unterklasse von UIView erstellen
Mit ..
quelle
Wenn Sie Ihre Schreibfedern nicht ändern und die Hierarchie nicht wie vorgeschlagen anzeigen möchten, erledigt David C. diese Methode für Sie. Verwenden Sie diese Methode, um Ihrem UIImageView abgerundete Ecken und Schatten hinzuzufügen: Beispiel:
(!) Aus Leistungsgründen halte ich es nicht für eine gute Idee, diesen Code in so etwas wie UITableView zu verwenden, da dieser Code die Ansichtshierarchie ändert. Daher werde ich vorschlagen, Ihre Feder zu ändern und eine Containeransicht für den Schatteneffekt hinzuzufügen und Davic C.-Code zu verwenden.
quelle
Alter Thread noch aktuell ...
Ich habe Daniel Gindis Methode so bearbeitet, dass sie auch mit Schaltflächen usw. verwendet werden kann. Wenn jemand abgerundete Ecken benötigt oder runde Ecken und einen Rand kombinieren möchte, muss dies auf der Ebene der Ansicht festgelegt werden, die an diese Methode übergeben wird. Ich habe auch die Rasterung eingestellt, um sie etwas zu beschleunigen.
quelle
Das Folgende hat für mich am besten funktioniert (dieser Code befindet sich in der UIView-Erweiterung, daher bezeichnet self einige UIView, zu denen wir einen Schatten und eine runde Ecke hinzufügen müssen).
Der Hauptunterschied zwischen diesem und anderen Codebeispielen besteht darin, dass dadurch die Schattenansicht als Geschwisteransicht hinzugefügt wird (im Gegensatz zum Hinzufügen der aktuellen Ansicht als Unteransicht der Schattenansicht), wodurch die Notwendigkeit entfällt, die vorhandene Ansichtshierarchie in irgendeiner Weise zu ändern.
quelle
Die Antwort von daniel.gindi oben hat den Trick für mich getan! (+1 daniel) Ich musste jedoch kleinere Anpassungen vornehmen - die Größe des shadowFrame so ändern, dass er der Frame-Größe der Ansicht entspricht, und die Benutzerinteraktion aktivieren. Hier ist der aktualisierte Code:
Ich möchte hinzufügen, dass ich in meinem Fall versucht habe, dies einem View-Controller eines Drittanbieters hinzuzufügen, dh ich hatte keine direkte Kontrolle über den Code. So habe ich die obige Funktion verwendet:
quelle
Ich nehme einige Änderungen am Code von daniel.gindi vor
Dies ist alles, was Sie brauchen, damit es funktioniert.
quelle
Sie müssen zwei verwenden
UIViews
, um dies zu erreichen. EinerUIView
arbeitet wie ein Schatten und der andere wie ein abgerundeter Rand.Hier ist ein Code-Snippet a
Class Method
mit Hilfe von aprotocol
:Im obigen Code
btnCompose_click:
wird eine@required
Delegatenmethode, die beim Klicken auf die Schaltfläche ausgelöst wird.Und hier habe ich einen Button zu meinem hinzugefügt
UIViewController
:Das Ergebnis sieht folgendermaßen aus:
quelle
Ich habe so viele Lösungen aus diesem Beitrag ausprobiert und bin zu der folgenden Lösung gekommen. Dies ist eine vollständige Proof- Lösung, es sei denn, Sie müssen Schatten auf eine klare Farbansicht legen .
quelle
Hier ist die Lösung, die sicher funktionieren wird!
Ich habe eine UIView-Erweiterung mit den erforderlichen Kanten erstellt, um Schatten wie unten beschrieben anzuwenden
Schließlich können Sie die Schattenfunktion für jede Ihrer UIView-Unterklassen wie folgt aufrufen. Sie können auch die Kante angeben, auf die Schatten angewendet werden sollen. Probieren Sie verschiedene Variationen aus, je nachdem, wie Sie die Parameter des folgenden Methodenaufrufs ändern müssen.
Ergebnisbild
quelle
Die Antwort von Evan Mulawski wird perfekt funktionieren. Der Haken ist, dass Sie die Hintergrundfarbe für die Ansicht auf clearColor und die Eigenschaft masksToBounds auf NO setzen müssen.
Sie können die gewünschte Farbe für die Ansicht festlegen
Hoffe das hilft..
quelle
So machen Sie es, mit abgerundeten Ecken und abgerundeten Schatten, ohne sich um Pfade zu kümmern.
Die Ansicht mit Inhalt, in meinem Fall eine UIImageView, hat einen Eckenradius und muss daher bis zu den Grenzen maskiert werden.
Wir erstellen eine weitere gleich große Ansicht für die Schatten, setzen maskToBounds auf NO und fügen dann die Inhaltsansicht zur Containeransicht hinzu (z. B. shadowContainer).
quelle
Ich schreibe diese UIView-Kategoriemethode, um dieses Problem zu lösen. Ich verwende separate Ansichten für den Schatten und den Eckenradius.
quelle
Swift 4- Lösung zum Runden von UICollectionViewCell und zum Hinzufügen von Schatten , ohne Erweiterungen und Komplikationen :)
Hinweis: Für einfache Ansichten zB Schaltflächen. Siehe die Antwort von @ suragch in diesem Beitrag. https://stackoverflow.com/a/34984063/7698092 . Erfolgreich auf Schaltflächen getestet
Im Fall , wenn jemand noch kämpfen runden die Ecken und fügen Schatten zugleich. Obwohl diese Lösung mit UICollectionViewCell funktioniert, kann sie auf jede Ansicht verallgemeinert werden.
Diese Technik funktionierte für mich ohne Erweiterungen und all die komplizierten Dinge. Ich arbeite mit storyBoard.
Technik
Sie müssen eine UIView (sagen wir "containerView") in Ihre UICollectionViewCell in storyBoard einfügen und alle erforderlichen Ansichten (Schaltflächen, Bilder usw.) in dieser containerView hinzufügen. Siehe den Screenshot.
Schließen Sie die Steckdose für containerView an. Fügen Sie der CellforItemAtIndexPath-Delegatenfunktion die folgenden Codezeilen hinzu.
Ausgabe
Siehe den Simulator-Screenshot
quelle
quelle