Wie zeichne ich eine Grenze um ein UILabel?

140

Gibt es eine Möglichkeit für UILabel, eine Grenze um sich selbst zu ziehen? Dies ist nützlich für mich, um die Textplatzierung zu debuggen und die Platzierung und die Größe des Etiketts zu sehen.

Segen
quelle

Antworten:

260

Sie können den Rahmen des Labels über die zugrunde liegende CALayer-Eigenschaft festlegen:

#import <QuartzCore/QuartzCore.h>

myLabel.layer.borderColor = [UIColor greenColor].CGColor
myLabel.layer.borderWidth = 3.0

Swift 5:

myLabel.layer.borderColor = UIColor.darkGray.cgColor
myLabel.layer.borderWidth = 3.0
Vladimir
quelle
2
Sie sind nur ab SDK 3.0 verfügbar :( Wenn Sie nur eine schnelle Lösung für Debugging-Zwecke wünschen, können Sie einen halbtransparenten farbigen Hintergrund für Ihr Etikett festlegen.
Vladimir
36
Wenn sich der Compiler beschwert, haben Sie wahrscheinlich vergessen#import <QuartzCore/QuartzCore.h>
Stefan Arentz
1
@Vladimir Diese Lösung fügt den Rand an allen Seiten des Etiketts hinzu. Können wir den Rand nur auf der rechten Seite des Etiketts hinzufügen?
Chinthakad
1
@ Chinthakad, nein. Ich denke, Sie benötigen eine benutzerdefinierte Etiketten-Unterklasse mit benutzerdefinierten Zeichnungen dafür
Vladimir
3
In Swift würde die erste Zeile lauten:myLabel.layer.borderColor = UIColor.greenColor().CGColor
Roshambo
71

Hier sind einige Dinge, die Sie tun können, UILabelund seine Grenzen.

Geben Sie hier die Bildbeschreibung ein

Hier ist der Code für diese Etiketten:

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var label1: UILabel!
    @IBOutlet weak var label2: UILabel!
    @IBOutlet weak var label3: UILabel!
    @IBOutlet weak var label4: UILabel!
    @IBOutlet weak var label5: UILabel!
    @IBOutlet weak var label6: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // label 1
        label1.layer.borderWidth = 1.0

        // label 2
        label2.layer.borderWidth = 5.0
        label2.layer.borderColor = UIColor.blue.cgColor

        // label 3
        label3.layer.borderWidth = 2.0
        label3.layer.cornerRadius = 8

        // label 4
        label4.backgroundColor = UIColor.cyan

        // label 5
        label5.backgroundColor = UIColor.red
        label5.layer.cornerRadius = 8
        label5.layer.masksToBounds = true

        // label 6
        label6.layer.borderWidth = 2.0
        label6.layer.cornerRadius = 8
        label6.backgroundColor = UIColor.yellow
        label6.layer.masksToBounds = true
    }
}

Beachten Sie, dass in Swift kein Import erforderlich ist QuartzCore.

Siehe auch

Suragch
quelle
1
Wie konnten Sie diese Polster bekommen? Mein Text berührt die Grenzen ...
Eestein
1
@eestein, ich glaube, ich habe gerade die Beschriftungsgröße im Interface Builder größer gezogen. Oder ich habe Größenbeschränkungen für sie festgelegt.
Suragch
19

Schnelle Version:

myLabel.layer.borderWidth = 0.5
myLabel.layer.borderColor = UIColor.greenColor().CGColor

Für Swift 3:

myLabel.layer.borderWidth = 0.5
myLabel.layer.borderColor = UIColor.green.cgColor
Esqarrouth
quelle
1
es wird seinmyLabel.layer.borderColor = UIColor.blackColor().CGColor!
Shruti
7

Swift 3/4 mit @IBDesignable


Zwar funktionieren fast alle oben genannten Lösungen einwandfrei, aber ich würde eine @IBDesignablebenutzerdefinierte Klasse dafür vorschlagen .

@IBDesignable
class CustomLabel: UILabel {

    /*
    // Only override draw() if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func draw(_ rect: CGRect) {
        // Drawing code
    }
    */

    @IBInspectable var borderColor: UIColor = UIColor.white {
        didSet {
            layer.borderColor = borderColor.cgColor
        }
    }

    @IBInspectable var borderWidth: CGFloat = 2.0 {
        didSet {
            layer.borderWidth = borderWidth
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.0 {
        didSet {
            layer.cornerRadius = cornerRadius
        }
    }
}
Vakas
quelle
2

Sie können dieses Repo verwenden: GSBorderLabel

Es ist ganz einfach:

GSBorderLabel *myLabel = [[GSBorderLabel alloc] initWithTextColor:aColor
                                                     andBorderColor:anotherColor
                                                     andBorderWidth:2];
JAA
quelle
Dies befasst sich mit Rahmen um die tatsächlichen Zeichen im Text, die Frage spricht über Rahmen um das Rechteck, in dem der Text enthalten ist.
jjxtra
1

UILabel-Eigenschaften borderColor, borderWidth, CornerRadius in Swift 4

@IBOutlet weak var anyLabel: UILabel!
   override func viewDidLoad() {
        super.viewDidLoad()
        anyLabel.layer.borderColor = UIColor.black.cgColor
        anyLabel.layer.borderWidth = 2
        anyLabel.layer.cornerRadius = 5
        anyLabel.layer.masksToBounds = true
}
Sanjay Mali
quelle
1

Lösung für Swift 4:

yourLabel.layer.borderColor = UIColor.green.cgColor

Exitare
quelle
0

Es hängt wirklich davon ab, wie viele Boarder in Ihrer Ansicht verwendet werden. Fügen Sie manchmal einfach eine UIVIEW hinzu, deren Größe etwas größer ist, um den Rahmen zu erstellen. Die Methode ist schneller als das Erstellen einer Ansicht

chings228
quelle