Ist eine dort in Art und Weise gebaut abgerundete Ecken UILabels zu schaffen? Wenn die Antwort nein ist, wie würde man gehen über das Erstellen eines solchen Objekts?
Wie erstelle ich eine Runde UILabel auf dem iPhone die Enge getrieben?
quelle vom benutzer newtonapple
In anderen Sprachen...
iOS 3.0 und höher
iPhone OS 3.0 und höher unterstützt die cornerRadiusEigenschaft auf die CALayerKlasse. Jede Ansicht hat eine CALayerInstanz , die Sie bearbeiten können. Das heißt , Sie abgerundete Ecken in einer Linie bekommen:
view.layer.cornerRadius = 8;
Sie werden müssen , #import <QuartzCore/QuartzCore.h>um den Rahmen und Quartz Link Zugriff auf CALayer Header und den Eigenschaften zu erhalten.
Vor dem iOS 3.0
Eine Möglichkeit, dies zu tun, die ich vor kurzem verwendet wird, ist eine UIView-Unterklasse zu schaffen, die einfach ein Rechteck mit abgerundeten Ecken ziehen, und dann macht die UILabel oder, in meinem Fall, UITextView, ein Subview im Innern. Speziell:
- Erstellen Sie eine
UIViewUnterklasse und nennen Sie es so etwas wieRoundRectView. - In
RoundRectView‚s -drawRect:Methode, einen Weg rund um die Grenzen ziehen der Ansicht verwendet Core Graphics wie CGContextAddLineToPoint () aufrufen , für die Kanten und CGContextAddArcToPoint und () für die abgerundeten Ecken. - Erstellen Sie eine
UILabelInstanz und machen es zu einem Subview des RoundRectView. - Stellen Sie den Rahmen des Etiketts ein paar Pixel des RoundRectView der Grenzen nach innen versetzt zu sein. (Beispiel
label.frame = CGRectInset(roundRectView.bounds, 8, 8);)
Sie können die RoundRectView auf einer Ansicht platzieren Interface Builder verwenden, wenn Sie einen generischen UIView erstellen und dann seine Klasse ändern Sie den Inspektor verwenden. Sie werden sehen, das Rechteck nicht, bis Sie Ihre Anwendung kompilieren und ausführen, aber zumindest werden Sie in der Lage sein, die Subview zu platzieren und an Steckdosen oder Aktionen zu verbinden, wenn nötig.
Bei Geräten mit iOS 7.1 oder höher, müssen Sie hinzufügen:
yourUILabel.layer.masksToBounds = YES;
yourUILabel.layer.cornerRadius = 8.0;
Für Swift IOS8 ab basierend auf OScarsWyck Antwort:
yourUILabel.layer.masksToBounds = true
yourUILabel.layer.cornerRadius = 8.0
Sie können abgerundeten Rand mit einer Breite von Rand jeder Kontrolle auf diese Weise machen: -
CALayer * l1 = [lblName layer];
[l1 setMasksToBounds:YES];
[l1 setCornerRadius:5.0];
// You can even add a border
[l1 setBorderWidth:5.0];
[l1 setBorderColor:[[UIColor darkGrayColor] CGColor]];
Ersetzen Sie einfach lblNamemit Ihrem UILabel.
Hinweis: - Vergessen Sie nicht zu importieren<QuartzCore/QuartzCore.h>
- Sie haben ein
UILabelgenannt:myLabel. - in Ihrem "m" oder "h" Datei-Import:
#import <QuartzCore/QuartzCore.h> in Ihrer
viewDidLoadSchreib dieser Zeile:self.myLabel.layer.cornerRadius = 8;- hängt davon ab, wie Sie wollen, Sie corner Wert von 8 bis andere Nummer ändern können :)
Viel Glück
xCode 7.3.1 iOS 9.3.2
_siteLabel.layer.masksToBounds = true;
_siteLabel.layer.cornerRadius = 8;
Eine andere Methode ist es, ein png hinter dem UILabel zu platzieren. Ich habe Ansichten mit mehreren Etiketten, die einen einzigen Hintergrund png überlagern, die alle Kunstwerk für die einzelnen Etiketten hat.
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
label.text = @"Your String.";
label.layer.cornerRadius = 8.0;
[self.view addSubview:label];
Ich machte eine rasche UILabelUnterklasse diesen Effekt zu erzielen. Außerdem stellte ich automatisch die Textfarbe schwarz oder weiß für maximalen Kontrast.
Ergebnis
Gebrauchte SO-Beiträge:
- Wie Rahmen um eine UILabel zu ziehen?
- Fügen Sie eine Grenze außerhalb eines UIView
- Überprüfen Sie, ob UIColor dunkel oder hell ist?
Spielplatz
fügen Sie diese einfach in einem iOS-Spielplatz:
//: Playground - noun: a place where people can play
import UIKit
class PillLabel : UILabel{
@IBInspectable var color = UIColor.lightGrayColor()
@IBInspectable var cornerRadius: CGFloat = 8
@IBInspectable var labelText: String = "None"
@IBInspectable var fontSize: CGFloat = 10.5
// This has to be balanced with the number of spaces prefixed to the text
let borderWidth: CGFloat = 3
init(text: String, color: UIColor = UIColor.lightGrayColor()) {
super.init(frame: CGRectMake(0, 0, 1, 1))
labelText = text
self.color = color
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
func setup(){
// This has to be balanced with the borderWidth property
text = " \(labelText)".uppercaseString
// Credits to https://stackoverflow.com/a/33015915/784318
layer.borderWidth = borderWidth
layer.cornerRadius = cornerRadius
backgroundColor = color
layer.borderColor = color.CGColor
layer.masksToBounds = true
font = UIFont.boldSystemFontOfSize(fontSize)
textColor = color.contrastColor
sizeToFit()
// Credits to https://stackoverflow.com/a/15184257/784318
frame = CGRectInset(self.frame, -borderWidth, -borderWidth)
}
}
extension UIColor {
// Credits to https://stackoverflow.com/a/29044899/784318
func isLight() -> Bool{
var green: CGFloat = 0.0, red: CGFloat = 0.0, blue: CGFloat = 0.0, alpha: CGFloat = 0.0
self.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
let brightness = ((red * 299) + (green * 587) + (blue * 114) ) / 1000
return brightness < 0.5 ? false : true
}
var contrastColor: UIColor{
return self.isLight() ? UIColor.blackColor() : UIColor.whiteColor()
}
}
var label = PillLabel(text: "yellow", color: .yellowColor())
label = PillLabel(text: "green", color: .greenColor())
label = PillLabel(text: "white", color: .whiteColor())
label = PillLabel(text: "black", color: .blackColor())
Adaequat in Xcode 8.1.2 mit Swift 3, getestet während AUGUST 2017
„Corner“ die Schlüsseleigenschaft ist die abgerundeten Kanten zu setzen, wo, wenn Sie den gleichen Stil für alle Etiketten in Ihrer Anwendung verwenden, würde ich für eine Verlängerung Methode empfehlen.
Code:
// extension Class
extension UILabel {
// extension user defined Method
func setRoundEdge() {
let myGreenColor = (UIColor(red: -0.108958, green: 0.714926, blue: 0.758113, alpha: 1.0))
//Width of border
self.layer.borderWidth = 1.0
//How much the edge to be rounded
self.layer.cornerRadius = 5.0
// following properties are optional
//color for border
self.layer.borderColor = myGreenColor.cgColor
//color for text
self.textColor = UIColor.red
// Mask the bound
self.layer.masksToBounds = true
//clip the pixel contents
self.clipsToBounds = true
}
}
Ausgabe:
Warum Erweiterung Methode?
Erstellen Sie eine Swift-Datei und fügen Sie den folgenden Code, der die Extention Methode zur „UILabel“ Klasse hat, wo diese Methode Benutzer definiert ist, aber für die ganze Etikett in Ihrer Anwendung und wird dazu beitragen, Konsistenz und sauberen Code zu erhalten, wenn Sie ändert jede mögliche Art in Zukunft benötigt nur in der Verlängerung Methode.
In Monotouch / Xamarin.iOS löste ich das gleiche Problem wie folgt aus:
UILabel exampleLabel = new UILabel(new CGRect(0, 0, 100, 50))
{
Text = "Hello Monotouch red label"
};
exampleLabel.Layer.MasksToBounds = true;
exampleLabel.Layer.CornerRadius = 8;
exampleLabel.Layer.BorderColor = UIColor.Red.CGColor;
exampleLabel.Layer.BorderWidth = 2;
Haben Sie versucht, die Verwendung UIButtonvon dem Interface Builder (das hat abgerundete Ecken) und mit den Einstellungen experimentieren , um es wie ein Etikett aussehen. wenn alles , was Sie wollen , ist im statischen Text anzuzeigen.
Swift 3
Wenn Sie abgerundete Etikett mit Hintergrundfarbe möchten, zusätzlich zu den meisten anderen Antworten, müssen Sie festlegen , layerwie auch ‚s Hintergrundfarbe. Es funktioniert nicht bei der Einstellung viewHintergrundfarbe.
label.layer.cornerRadius = 8
label.layer.masksToBounds = true
label.layer.backgroundColor = UIColor.lightGray.cgColor
Wenn Sie die automatische Layout verwenden, wollen einige Polsterung um das Etikett und wollen nicht auf die Größe des Etiketts manuell einstellen, können Sie UILabel Unterklasse und überschreiben erstellen intrinsincContentSizeEigenschaft:
class LabelWithPadding: UILabel {
override var intrinsicContentSize: CGSize {
let defaultSize = super.intrinsicContentSize
return CGSize(width: defaultSize.width + 12, height: defaultSize.height + 8)
}
}
Um die beiden kombinieren können hier auch festlegen müssen label.textAlignment = center, sonst wird der Text würde ausgerichtet bleiben.
Funktioniert perfekt in Swift 2.0
@IBOutlet var theImage: UIImageView! //you can replace this with any UIObject eg: label etc
override func viewDidLoad() {
super.viewDidLoad()
//Make sure the width and height are same
self.theImage.layer.cornerRadius = self.theImage.frame.size.width / 2
self.theImage.layer.borderWidth = 2.0
self.theImage.layer.borderColor = UIColor.whiteColor().CGColor
self.theImage.clipsToBounds = true
}
Je nachdem, was genau Sie Sie tun, könnte ein Bild machen und es als Hintergrund programmatisch.



