Wie erstelle ich eine Runde UILabel auf dem iPhone die Enge getrieben?

stimmen
139

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?

Veröffentlicht am 04/02/2009 um 08:19
quelle vom benutzer
In anderen Sprachen...                            


16 antworten

stimmen
223

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:

  1. Erstellen Sie eine UIViewUnterklasse und nennen Sie es so etwas wie RoundRectView.
  2. 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.
  3. Erstellen Sie eine UILabelInstanz und machen es zu einem Subview des RoundRectView.
  4. 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.

Beantwortet am 04/02/2009 um 10:22
quelle vom benutzer

stimmen
130

Bei Geräten mit iOS 7.1 oder höher, müssen Sie hinzufügen:

yourUILabel.layer.masksToBounds = YES;
yourUILabel.layer.cornerRadius = 8.0;
Beantwortet am 04/04/2014 um 08:54
quelle vom benutzer

stimmen
17

Für Swift IOS8 ab basierend auf OScarsWyck Antwort:

yourUILabel.layer.masksToBounds = true
yourUILabel.layer.cornerRadius = 8.0
Beantwortet am 17/08/2015 um 16:08
quelle vom benutzer

stimmen
11

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>

Beantwortet am 13/02/2014 um 09:09
quelle vom benutzer

stimmen
11
  1. Sie haben ein UILabelgenannt: myLabel.
  2. in Ihrem "m" oder "h" Datei-Import: #import <QuartzCore/QuartzCore.h>
  3. 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

Beantwortet am 04/12/2012 um 11:08
quelle vom benutzer

stimmen
6

xCode 7.3.1 iOS 9.3.2

 _siteLabel.layer.masksToBounds = true;
  _siteLabel.layer.cornerRadius = 8;
Beantwortet am 21/07/2016 um 11:22
quelle vom benutzer

stimmen
6

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.

Beantwortet am 04/02/2009 um 18:24
quelle vom benutzer

stimmen
4
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
    label.text = @"Your String.";
    label.layer.cornerRadius = 8.0;
    [self.view addSubview:label];
Beantwortet am 21/05/2014 um 07:44
quelle vom benutzer

stimmen
3

Wenn Sie UI abgerundete Ecke wollen Objekte wie ( UILabel, UIView, UIButton, UIImageView) von Storyboard dann gesetzt clip to boundswahr und stellen User Defined Runtime AttributesSchlüsselpfad als layer.cornerRadiusTyp = Anzahl und Wert = 9 (als Ihre Anforderung)

Set Clip Grenzen als Set User Defined Runtime-Attribute als

Beantwortet am 28/06/2017 um 10:49
quelle vom benutzer

stimmen
3

Ich machte eine rasche UILabelUnterklasse diesen Effekt zu erzielen. Außerdem stellte ich automatisch die Textfarbe schwarz oder weiß für maximalen Kontrast.

Ergebnis

Farben-abgerundete Ränder

Gebrauchte SO-Beiträge:

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())
Beantwortet am 30/03/2016 um 14:16
quelle vom benutzer

stimmen
2

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:

Geben Sie hier image description

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.

Beantwortet am 15/08/2017 um 13:25
quelle vom benutzer

stimmen
2

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;
Beantwortet am 14/01/2016 um 14:23
quelle vom benutzer

stimmen
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.

Beantwortet am 09/03/2009 um 21:45
quelle vom benutzer

stimmen
1

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.

Beantwortet am 29/05/2017 um 21:52
quelle vom benutzer

stimmen
1

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

    }
Beantwortet am 16/04/2016 um 22:02
quelle vom benutzer

stimmen
0

Je nachdem, was genau Sie Sie tun, könnte ein Bild machen und es als Hintergrund programmatisch.

Beantwortet am 05/11/2011 um 01:55
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more