UIView mit abgerundeten Ecken und Schlagschatten?
Ich habe buchstäblich alles versucht, was ich konnte, aber keiner von Ihnen arbeiten für eine benutzerdefinierte UIView
... ich wollte nur eine leere weiße anzeigen mit abgerundeten Ecken und einem leichten Schlagschatten (ohne Beleuchtung-Effekt). Ich kann jedem von denen, aber die üblichen clipToBounds
/maskToBounds
Konflikte auftreten.
Da sagen Sie in einem Kommentar unten, dass Sie diese Arbeit mit CoreGraphics, würde es Ihnen etwas ausmachen sharing die Antwort mit der community, so dass Sie anderen helfen können, in der gleichen situation, als Sie versuchten, Ihnen zu helfen?
Tut mir Leid, das war ziemlich lange her, und ich habe nicht die Quelle nicht mehr. Was ich Tat, war override -drawRect:, und verwenden Sie UIBezierPath um ein Rechteck zu zeichnen, und wenden Sie einen Schatten auf die Ebene mit den sicherungen der Ansicht... wenn ich mich richtig erinnere. 🙂
Die akzeptierte Antwort funktioniert nicht!
Mögliche Duplikate von Geben UIView abgerundeten Ecken
Sie sollten überprüfen, die Termine der beiden Beiträge, bevor Sie kommentieren.
Tut mir Leid, das war ziemlich lange her, und ich habe nicht die Quelle nicht mehr. Was ich Tat, war override -drawRect:, und verwenden Sie UIBezierPath um ein Rechteck zu zeichnen, und wenden Sie einen Schatten auf die Ebene mit den sicherungen der Ansicht... wenn ich mich richtig erinnere. 🙂
Die akzeptierte Antwort funktioniert nicht!
Mögliche Duplikate von Geben UIView abgerundeten Ecken
Sie sollten überprüfen, die Termine der beiden Beiträge, bevor Sie kommentieren.
InformationsquelleAutor Aditya Vaidyam | 2011-01-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den folgenden code-snippet fügt einen border, border-radius und drop-shadow zu
v
eineUIView
:Können Sie die Einstellungen anpassen, um Ihre Bedürfnisse anzupassen.
Außerdem fügen Sie das QuartzCore-framework zu Ihrem Projekt und:
Sehen meine andere Antwort über
masksToBounds
.Hinweis
Kann dies nicht in allen Fällen funktionieren. Wenn Sie feststellen, dass diese Methode mischt sich mit anderen Zeichenoperationen, die Sie durchführen, finden Sie diese Antwort.
gleiche problem hier. Wenn ich eine hintergrund Farbe, die ich will, zu abgeschnitten, die Ecken abgerundet. Zu tun, dass ich maskToBounds=TRUE, aber dann ist der Schatten verschwindet..
Wird nicht funktionieren, mit abgerundeten Ecken.
Die Art und Weise, um dies Werk der richtige Weg ist die Verwendung einer inneren container-Ansicht, die Haus an Ihre Grenze und Ihre Hintergrundfarbe, sowohl mit Ecke radius. Diese Ansicht wird abgeschnitten, um Grenzen! Die zweite, äußere container view house die erste, hat den gleichen Rahmen, nur mit einem Schlagschatten. Ich habe dies schon ein paar mal zu kombinieren, eine Grenze, schattenwurf und Eckenradius. Es ist wirklich nervig, aber es funktioniert wirklich gut.
Funktioniert nicht. Keine Ahnung, warum es so viele Stimmen. War dies zutreffend, die in älteren Versionen?
InformationsquelleAutor Evan Mulawski
Swift
Die Erkundung der Optionen
Problem 1: Schatten wird abgeschnitten
Was ist, wenn es gibt Unterebenen oder Untersichten (wie ein Bild), auf deren Inhalte wir wollen clip auf die Grenzen unserer Sicht?
Wir können dies erreichen, mit
(Alternativ
blueView.clipsToBounds = true
gibt die dasselbe Ergebnis.)Aber oh Nein! Der Schatten wurde auch abgeschnitten, denn es ist außerhalb der Grenzen! Was ist zu tun? Was ist zu tun?
Lösung
Verwenden Sie unterschiedliche Ansichten für die Schatten und die Grenze. Die Basis ist transparent und hat Schatten. Die Grenze betrachten clips sonstige subcontent, dass es an seine Grenzen.
Diese ergibt Folgendes Ergebnis:
Problem 2: Schlechte Leistung
Hinzufügen abgerundeten Ecken und Schatten werden zu einem Leistungseinbruch. Sie können die performance verbessern, indem Sie einen vordefinierten Weg für den Schatten und auch die Angabe, dass es gerastert werden. Der folgende code Hinzugefügt werden kann, um das Beispiel oben.
Sehen dieser Beitrag für mehr details. Sehen hier und hier auch.
Dieser Antwort wurde getestet mit Swift 4 und Xcode 9.
Wenn Sie nur wollen, eine Grenze (und/oder Eckradius), dann brauchen Sie nicht einen separaten Ansicht. Die separate Ansicht für die situation, wo Sie brauchen, Runde Ecken und shadow.
Dies ist nicht für mich arbeiten. Wenn ich die hintergrund Farbe von klar auf der baseView ein Schatten nicht mehr angezeigt. Was mache ich falsch?
Funktioniert nicht, die Einstellung
baseView.backgroundColor = UIColor.clear
entfernt die Schatten. Nur wenn Sie eine Hintergrundfarbe eingestellt ist, werden Sie es sehen.FYI ich war zunächst zu sehen das gleiche problem, dass andere Kommentatoren waren zu sehen, wo die baseView, die Schatten nicht angezeigt, wenn Sie die Hintergrundfarbe war klar. Das problem war, dass ich nur dem ersten Teil des Codes (der baseView-Zeug). Einmal habe ich den borderView als eine Untersicht der Schatten begann mit der Anzeige. Scheint, dass der Schatten auf display-es muss mindestens eine sichtbare Grenze (oder hintergrund) im view-Hierarchie. So sicher sein, dass borderView.Schicht.borderWidth >= 0 mit einer nicht-transparenten borderView.Schicht.borderColor (oder ein nicht-transparenter hintergrund-Farbe)
InformationsquelleAutor Suragch
Einen Weg, dies zu tun ist, um die Ansicht mit abgerundeten Ecken in einer Ansicht mit dem drop shadow.
Dann können Sie die shadowView, wo immer Sie wollen.
Amit, müssen Sie maskToBounds/clipToBounds = JA für die * roundedView nur *. Setzen Sie NICHT diese auf die shadowView. Ich habe nicht versucht, den oben genannten code, aber sicher wissen Sie, dass diese Lösung funktioniert auf jeden Fall wenn auch nicht ideal. Die höhere shadowRadius kümmert sich um die Ecke, radius-Bereiche. Legen Sie die shadowRadius auf 0 oder 1 und Sie werden feststellen, was ich zu sagen versuche.
So etwas wie shadowView.Schicht.shadowOpacity = 0.6; fehlt
"shadowView.Schicht.opacity = 1.0" sollte "shadowView.Schicht.shadowOpacity = 1.0"
Funktioniert auf iOS 9, wenn die Verwendung shadowView.Schicht.shadowOpacity = 1.0
InformationsquelleAutor David C.
Dieser arbeitete für mich. Trick war, um verschieben Sie die Hintergrundfarbe aus der Haupt-Ansicht der Schicht.
Obwohl alle anderen Lösungen arbeiten, und vielleicht sind Sie mehr Allgemeinen, dies ist bei weitem die beste Lösung für das problem. Hinzufügen Untersichten oder Unterebenen erstellen Sie eine Welt oder Schmerzen versuchen zu halten die frame-Größen, oder, am besten, zu Leistungsproblemen führen kann.
Dies sollte die Antwort sein. Sauber und elegant.
Beste Lösung und auf jeden Fall elegant!
Wow, das funktioniert tatsächlich. Ich verstehe nicht, warum es funktionieren sollte-Sie würde denken, der Ansicht backgroundColor richtig würde direkt anzeigen, um die Ebene.backgroundColor-Eigenschaft, die auf iOS-aber es FUNKTIONIERT. (Xcode 8, Swift 3.) Gut gemacht, und danke. Dies sollte die akzeptierte Antwort.
InformationsquelleAutor Ade
Einfache Swift 4-Lösung, basierend auf Ade ' s Antwort ohne zusätzliche Untersichten, Unterklassen oder extra basteln:
Beachten Sie, dass sollten Sie Ihre Ansicht mit Eckenradius und andere Eigenschaften vor aufrufen
addShadow
.Den Anruf direkt aus
viewDidLoad
wie diese:Endergebnis:
Einfach Super und einfach!
EDIT:
Ich sehe eine Menge Leute haben einige Probleme mit diesem Beispiel, so habe ich eine einfach Xcode-Projekt, um zu zeigen, wie es verwendet werden soll.
OK funktioniert wie beschrieben, sogar mit cornerRadius.
Funktioniert das auf Schaltflächen? Weil es nicht funktioniert auf mein Ende.
Funktioniert das nicht. Ich denke, @SergeyGrischyov, hat einen Eckenradius hintergrund-Bild für diesen button.
Dies funktionierte perfekt für mich.
InformationsquelleAutor Sergey Grischyov
Ich löste das problem mithilfe der folgenden trick beim zuordnen der Schatten Weg für die container-Ansicht :
Beachten Sie, dass der Pfad angegeben, der Schatten ist ein Rechteck mit abgerundeten Ecken mit dem gleichen radius-Ecke, wie der hintergrund, die die Zelle enthält:
InformationsquelleAutor Alex Stone
Wenn Sie kämpfen, weil der abgerundete
corners
vs.subviews
vs.masksToBounds
, dann versuchen Sie es mit meiner Funktion:nennen es auf Ihrer Ansicht. ob Ihre Ansicht hat abgerundete Ecken, egal, Ihre Größe, Ihre Form - eine schöne Schatten gezeichnet werden.
Halten Sie einfach die return-Wert der Funktion, so dass Sie darin nachschlagen können, wenn Sie möchten, entfernen Sie die Tabelle (oder, zum Beispiel, verwenden Sie
insertSubview:aboveView:
)Sehen Sie in den Zeilen wo "// Ändern Sie diese, wenn nötig" angegeben ist? Das ist, was Sie brauchen. Schatten.userInteractionEnabled = JA;
das habe ich versucht. aber leider funktioniert nicht
dann sollten Sie testen, die frames der Ansicht und Untersicht zu sehen, warum. etwas ist wahrscheinlich nicht richtig. genau diesem code funktioniert für mich einige sehr schöne apps
Diese Lösung funktioniert gut für UITableViews mit abgerundeten Ecken. Ich wünschte, ich könnte es mehr Stimmen. Danke!
InformationsquelleAutor daniel.gindi
Mit Swift 4 und Xcode 9, dies ist ein funktionierendes Beispiel der Rundung ein
ImageView
mit Schlagschatten, und eine Grenze.Wenn Sie möchten, dass das Bild Runder: (und ohne Grenze)
InformationsquelleAutor rbaldwin
Habe ich einen Helfer auf UIView
können Sie es so nennen
Hier ist die Implementierung
Das ist schöne Lösung, aber es funktioniert nicht mit autolayout: die Ansicht gezogen werden Ursprung 0,0
InformationsquelleAutor Zayin Krige
Nach einem ganzen Tag der Forschung der Runde-Ecke-Ansicht mit Schatten, ich bin froh, dass die post meine eigene uiview Klasse hier, hoffe Ende diese Frage:
RoundCornerShadowView.h
RoundCornerShadowView.m
so, KEINE Notwendigkeit, fügen Sie die Untersicht oder unten in der target-Ansicht, fügen Sie einfach einen layer in der aktuellen Ansicht, und tun Schritt 3, um es zu vollenden!
werfen Sie einen Blick auf die Kommentare im code, ist es hilfreich, die Komponente verstehen!
InformationsquelleAutor lwz7512
Swift 3 & IBInspectable Lösung:
Inspiriert von Ade die Lösung
Erstellen Sie zuerst ein UIView-Erweiterung:
Dann, wählen Sie einfach Ihre UIView im interface builder festlegen Schatten AUF und Eckenradius, wie unten:
Das Ergebnis!
Hast du gelesen "Swift 3" in der begin des Threads? Also, es bedeutet, dass Swift 3-Lösung, habe ich nicht getestet es in Swift 4.1, weil ich brauche es nicht mehr. Fühlen Sie sich frei zu Bearbeiten und die Antwort geben, eine Lösung. 😉 Cheers
InformationsquelleAutor Tom Calmon
Etwas swifty getestet swift 4
Produziert
Wenn Sie es aktivieren, im Bereich "Informationen" wie diese:
Wird es fügen Sie die Benutzer-Definierte Runtime-Attribut, was in:
(Ich fügte hinzu, die zuvor die
cornerRadius = 8
)🙂
InformationsquelleAutor dGambit
Müssen Sie verwenden Sie verwenden Sie
shadowView
undroundView
shadowView
roundView
shadowView
ein bisschen nach innen, und Ihre Schatten braucht, um zu Leuchten. Passen Sie dieinsets
so dassshadowView
ist völlig unsichtbar hinterroundView
roundView
Den code
Oder Sie können einfach tun, unten ohne Angabe
clipToBounds/maskToBounds
InformationsquelleAutor onmyway133
Shadow + Grenze + Eckenradius
InformationsquelleAutor Darshit Shah
Hier ist meine version von Swift 3 für einen UIView
InformationsquelleAutor Yung Dai
Swift 4 : Erstellen Sie eine Unterklasse von UIView
Durch..
InformationsquelleAutor benmore99
Gut, wenn Sie nicht wollen, ändern Sie Ihre Federn-und Sicht-Hierarchie vorgeschlagen, David C. diese Methode wird es für Sie tun. Hinzufügen abgerundeten Ecken und Schatten zu Ihrem UIImageView nur diese Methode verwenden, zum Beispiel:
(!) Aus performance-Gründen glaube ich nicht, es ist eine gute Idee, verwenden Sie diesen code in so etwas wie UITableView, da diese code-änderungen anzeigen-Hierarchie. So werde ich vorschlagen, ändern Ihre Spitze, und fügen Sie eine container-Ansicht für Schatten-Effekt und verwenden Davic C. code.
InformationsquelleAutor Roman Minenok
Alte thread noch aktuell ist...
Ich habe bearbeitet Daniel Gindi Methode, um machen es möglich, es zu benutzen mit Tasten usw. wie gut.
Wenn jemand braucht abgerundeten Ecken oder will kombinieren Sie Runde Ecken und eine Grenze gesetzt werden muss, um auf die view-Schicht, die an diese Methode. Ich habe auch die Rasterung zu beschleunigen, ein wenig.
InformationsquelleAutor NickBln
Hier ist die Lösung für masksToBounds Konflikt problem, es funktioniert für mich.
Nachdem Sie den corderRadius/borderColor/Schatten und so weiter, setzen masksToBounds wie KEINE:
InformationsquelleAutor Shaopeng Wang
Die folgenden arbeitete für mich am besten
(dieser code liegt in UIView-Erweiterung, also sich selbst bezeichnet, einige UIView, auf die müssen wir hinzufügen, Schatten und Runde Ecke)
Den wichtigsten Unterschied zwischen diesem und anderen code-Beispiele ist, dass diese fügt der shadow-Ansicht als Geschwister Ansicht (vor hinzufügen der aktuellen Ansicht als unteransicht der Schatten-view), dadurch entfällt die Notwendigkeit zur änderung der bestehenden view-Hierarchie in keiner Weise.
InformationsquelleAutor Mehul Parmar
daniel.gindi Antwort oben hat den trick für mich! (+1 daniel) Allerdings hatte ich, um kleinere Anpassungen vornehmen - ändern Sie die shadowFrame Größe sein wie anzeigen, können Sie die Bildgröße, und aktivieren Sie Benutzer-Interaktion. Hier ist der aktualisierte code:
Möchte ich hinzufügen, dass in meinem Fall, ich habe versucht, fügen Sie diese zu einem 3rd-party-view-controller, d.h. ich habe keine direkte Kontrolle über den code. So, hier ist, wie ich die obige Funktion:
InformationsquelleAutor Digitrance
Ich einige änderungen an der code von daniel.gindi
Dies ist alles, was Sie brauchen, um es zu arbeiten.
InformationsquelleAutor Carlos López
Müssen Sie zwei
UIViews
um dies zu erreichen. EineUIView
funktioniert wie Schatten und andere wird für die Arbeit abgerundeten Rahmen.Hier ist ein code-snippet ein
Class Method
mit Hilfe einesprotocol
:In den obigen code
btnCompose_click:
wird ein@required
delegate-Methode, die das Feuer auf die Schaltfläche klicken.Und hier habe ich noch einen Knopf an meiner
UIViewController
wie diese:Das Ergebnis wird wie folgt Aussehen:
InformationsquelleAutor Vaibhav Saran
Ich habe versucht, so viele Lösungen aus diesem Beitrag und endete mit der nachstehenden Lösung. Dies ist vollen Beweis Lösung , es sei denn, Sie brauchen, um Schatten in einem klaren Farbe.
lol...ist das nicht funktioniert?
Ich war nur die Korrektur des englischen. 🙂 Die Lösung funktioniert.
InformationsquelleAutor Mahesh Agrawal
Die Antwort von Evan Mulawski perfekt funktionieren wird. Der Haken ist, dass Sie haben, um die Hintergrundfarbe für die Ansicht clearColor und die masksToBounds-Eigenschaft auf NEIN.
Können Sie einstellen, welche Farbe Sie möchten, legen Sie es wie
Hoffe, das hilft..
InformationsquelleAutor Abdur Rahman
Dies ist, wie Sie es tun, mit abgerundeten Ecken und abgerundeten Schatten ohne Mühe mit Pfade.
Ansicht mit Inhalt, in meinem Fall ein UIImageView, hat einen Eckenradius und daher hat die Maske an Grenzen.
Erstellen wir eine weitere gleich große Ansicht für die Schatten, es maskToBounds auf NEIN und fügen Sie dann den Inhalt anzeigen, um die container anzeigen (z.B. shadowContainer).
InformationsquelleAutor Ford Davis
Schreibe ich diese Kategorie UIView Methode, um dieses problem zu lösen, verwendet separate Ansichten für die Schatten und die Ecke radius.
InformationsquelleAutor Liu Chao
Müssen Sie hinzufügen
masksToBounds = true
für kombiniert zwischencorderRadius
shadowRadius
.InformationsquelleAutor Issam eddine bellemallem
Swift 4 Lösung für die Herstellung UICollectionViewCell Runde und hinzufügen Schatten, ohne jegliche Erweiterungen und Komplikationen 🙂
Hinweis: Für einen einfachen Blick auf e.g-Tasten. Siehe @suragch Antwort in diesem post.
https://stackoverflow.com/a/34984063/7698092. Erfolgreich getestet für buttons
Fall, wenn eine noch kämpfen zu Runde die Ecken und hinzufügen Schatten zur gleichen Zeit. Obwohl diese Lösung funktioniert mit UICollectionViewCell, es kann verallgemeinert werden, um jede Sicht.
Diese Technik für mich gearbeitet, ohne jegliche Erweiterungen und all die komplizierten Sachen. Ich arbeite mit storyBoard.
Technik
Müssen Sie einen UIView (lets sagen, dass es "containerView") in Ihren UICollectionViewCell in storyBoard und fügen Sie alle erforderlichen Ansichten (buttons, Bilder usw.) innerhalb dieser containerView.
Siehe auch den Screenshot.
Schließen Sie den Auslass für containerView. Fügen Sie folgende Codezeilen in CellforItemAtIndexPath delegieren Funktion.
Ausgabe
Sehen den simulator Screenshot
InformationsquelleAutor Awais Fayyaz
InformationsquelleAutor jeevan eashwar