Gibt es eine Möglichkeit, cornerRadius
nur die obere linke und obere rechte Ecke von a UIView
festzulegen?
Ich habe Folgendes versucht, aber am Ende wird die Ansicht nicht mehr angezeigt.
UIView *view = [[UIView alloc] initWithFrame:frame];
CALayer *layer = [CALayer layer];
UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRoundedRect:frame byRoundingCorners:(UIRectCornerTopLeft|UIRectCornerTopRight) cornerRadii:CGSizeMake(3.0, 3.0)];
layer.shadowPath = shadowPath.CGPath;
view.layer.mask = layer;
view.bounds
, nichtframe
, (2) sollte die Schicht ein seinCAShapeLayer
, nichtCALayer
; (3) Stellen Sie die Ebenepath
nicht einshadowPath
.Antworten:
Beachten Sie, dass Sie Layoutbeschränkungen in Ihrer UIView-Unterklasse wie folgt aktualisieren müssen:
Wenn Sie das nicht tun, wird es nicht angezeigt.
Verwenden Sie zum Abrunden von Ecken die Erweiterung:
quelle
Ich bin nicht sicher, warum Ihre Lösung nicht funktioniert hat, aber der folgende Code funktioniert für mich. Erstellen Sie eine Bezier-Maske und wenden Sie sie auf Ihre Ansicht an. In meinem Code unten habe ich die unteren Ecken des
_backgroundView
mit einem Radius von 3 Pixel abgerundet .self
ist ein BrauchUITableViewCell
:Schnelle Version mit einigen Verbesserungen:
Swift 3.0 Version:
Schnelle Erweiterung hier
quelle
viewDidLoad
Methode gemacht, es verschobenviewDidAppear
und es hat funktioniert.simulator
Größe im Storyboard.ex: if the simulator size is 6s it works fine for 6s, but not of others.
Wie kann ich das überwinden?path.CGPath
sollte seinpath.cgPath
viewWillAppear
stattdessen in. Das funktioniert auch.Hier ist eine Swift- Version der Antwort von @JohnnyRockex
Hinweis
Wenn Sie das automatische Layout verwenden , müssen Sie Ihre Ansicht unterordnen
UIView
undroundCorners
die Ansicht aufrufen ,layoutSubviews
um einen optimalen Effekt zu erzielen.quelle
.TopRight
und.BottomRight
scheinen nicht für mich zu arbeiten.view.roundCorners([.TopLeft , .BottomLeft], radius: 10)
.layoutIfNeeded()
diese Methode aufrufen .Und schließlich… gibt es CACornerMask in iOS11! Damit
CACornerMask
geht es ganz einfach:quelle
Schnelles Codebeispiel hier: https://stackoverflow.com/a/35621736/308315
Nicht direkt. Sie müssen:
CAShapeLayer
path
ein,CGPathRef
basierend auf,view.bounds
aber mit nur zwei abgerundeten Ecken (wahrscheinlich mit+[UIBezierPath bezierPathWithRoundedRect:byRoundingCorners:cornerRadii:]
)view.layer.mask
einCAShapeLayer
quelle
Hier ist eine kurze Methode, die wie folgt implementiert ist:
quelle
In Swift 4.1 und Xcode 9.4.1
In iOS 11 reicht diese einzelne Zeile aus:
Siehe den vollständigen Code:
Aber für niedrigere Versionen
Vollständiger Code ist.
Wenn Sie AutoResizing im Storyboard verwenden, schreiben Sie diesen Code in viewDidLayoutSubviews () .
quelle
iOS 11, Swift 4
Und Sie können diesen Code ausprobieren:
Und Sie können dies in der Zelle der Tabellenansicht verwenden.
quelle
Dies wäre die einfachste Antwort:
quelle
Versuchen Sie diesen Code,
quelle
Emma:
.TopRight
und.BottomRight
arbeiten vielleicht nicht für dich, weil der Anrufview.roundCorners
erledigt ist, BEVOR das Finaleview bounds
berechnet wird. Beachten Sie, dass dieBezier Path
Ansicht aus den Ansichtsgrenzen zum Zeitpunkt des Aufrufs stammt. Wenn beispielsweise das automatische Layout die Ansicht einschränkt, befinden sich die runden Ecken auf der rechten Seite möglicherweise außerhalb der Ansicht. Versuchen Sie, es dort aufzurufenviewDidLayoutSubviews
, wo die Grenze der Ansicht endgültig ist.quelle
Swift 4 Swift 5 einfacher Weg in 1 Zeile
Verwendungszweck:
Funktion:
In Ziel-C
Verwendungszweck:
[self.verticalSeparatorView roundCorners:UIRectCornerTopLeft radius:10.0];
In einer Kategorie verwendete Funktion (nur eine Ecke):
quelle
Meine Lösung zum schnellen Abrunden bestimmter Ecken von UIView und UITextFiels ist die Verwendung
und
der tatsächlichen UIView oder UITextFields.
Beispiel:
Und mit
und
Ich kann die obere rechte und untere rechte Ecke des zu rundenden UITextField angeben.
Sie können das Ergebnis hier sehen:
quelle
Swift 4
quelle
Eine Möglichkeit, dies programmgesteuert zu tun, besteht darin, einen
UIView
über dem oberen TeilUIView
der abgerundeten Ecken zu erstellen . Oder Sie könnten die Oberseite unter etwas verstecken.quelle
quelle
Am einfachsten wäre es, eine Maske mit einer abgerundeten Eckschicht zu erstellen.
Und vergessen Sie nicht:
quelle
Alle bereits gegebenen Antworten sind wirklich gut und gültig (insbesondere die Idee von Yunus, die zu verwenden
mask
Eigenschaft zu nutzen).Ich brauchte jedoch etwas Komplexeres, da meine Ebene häufig die Größe ändern konnte, was bedeutete, dass ich diese Maskierungslogik jedes Mal aufrufen musste, was etwas ärgerlich war.
Ich habe schnelle
extensions
und berechnete Eigenschaften verwendet, um eine reale zu erstellencornerRadii
die sich um die automatische Aktualisierung der Maske kümmert, wenn die Ebene angelegt wird.Dies wurde mit Peter Steinberg großen Aspekten erreicht Bibliothek für Swizzling.
Der vollständige Code ist hier:
Ich habe einen einfachen Blog-Beitrag geschrieben , der dies erklärt.
quelle
Wenn Sie nach einer Lösung suchen, die nur für den Interface Builder geeignet ist, gibt es eine für iOS 11 und höher . Siehe meine Antwort hier: https://stackoverflow.com/a/58626264
quelle
So können Sie mit Xamarin in C # einen Eckenradius für jede Ecke einer Schaltfläche festlegen :
quelle
Eine schöne Erweiterung zur Wiederverwendung der Yunus Nedim Mehel-Lösung
Swift 2.3
Verwendungszweck
quelle
Nach dem Ändern des Code-Bits @apinho In Swift 4.3 funktioniert es einwandfrei
So verwenden Sie diese Funktion für Ihre Ansicht
quelle
Eine andere Version von Stephanes Antwort.
quelle
Erstellen Sie es in Swift 4.2
@IBDesignable
wie folgt:quelle
Einfache Erweiterung
Verwendungszweck:
quelle