Wie kann ich die benutzerdefinierte Rahmenfarbe von UIView programmgesteuert festlegen?


Antworten:


202

Wenn Sie Swift 2.0+ verwenden

self.yourView.layer.borderWidth = 1
self.yourView.layer.borderColor = UIColor(red:222/255, green:225/255, blue:227/255, alpha: 1).cgColor

Hinweis: Dies schien bei mir nicht zu funktionieren (vielleicht weil ich auf Swift 3.1 bin?). Paras Joshis ( stackoverflow.com/a/29701061/225813 ) Version hat jedoch funktioniert
Ashley Coolman

Ich habe meine Antwort bearbeitet. es wird sicher für Sie arbeiten .. Ashley Coolman
Shashi Verma

1
Sie müssen init nicht explizit in Swift 3
aufrufen

Ist es möglich, mehr als eine Farbe zu verwenden?
Gökhan Çokkeçeci

3
Gibt es einen Unterschied zwischen Ihren beiden Versionen?
Fogmeister

88

In Swift 4 können Sie die Rahmenfarbe und -breite mithilfe des folgenden Codes auf UIControls einstellen.

let yourColor : UIColor = UIColor( red: 0.7, green: 0.3, blue:0.1, alpha: 1.0 )
yourControl.layer.masksToBounds = true
yourControl.layer.borderColor = yourColor.CGColor
yourControl.layer.borderWidth = 1.0

<Swift 4 , Sie können die Rahmenbreite und die Rahmenfarbe von UIView mit dem folgenden Code einstellen.

yourView.layer.borderWidth = 1

yourView.layer.borderColor = UIColor.red.cgColor

1
@ ShashiVerma Gern geschehen. Um detaillierte Informationen zu Ebenen zu erhalten, lesen Sie die Klassenreferenzdokumente der verschiedenen Objekte von Apple, damit dies auch für Sie hilfreich ist :)
Paras Joshi

16

Verwenden Sie dazu @IBDesignable und @IBInspectable .

Sie sind wiederverwendbar und können über den Interface Builder leicht geändert werden. Die Änderungen werden sofort im Storyboard angezeigt

Passen Sie die Objekte im Storyboard an die jeweilige Klasse an

Code-Auszug:

@IBDesignable
class CustomView: UIView{

@IBInspectable var borderWidth: CGFloat = 0.0{

    didSet{

        self.layer.borderWidth = borderWidth
    }
}


@IBInspectable var borderColor: UIColor = UIColor.clear {

    didSet {

        self.layer.borderColor = borderColor.cgColor
    }
}

override func prepareForInterfaceBuilder() {

    super.prepareForInterfaceBuilder()
}

}

Ermöglicht die einfache Änderung von Interface Builder:

Interface Builder


Ich mag diese Lösung mehr, da es sich um eine wiederverwendbare Lösung handelt, bei der wir die UIView auf die benutzerdefinierte Ansicht setzen, aber noch mehr Änderungen zulassen.
n0rm

Dies war mein Lieblingsweg, um es zu erreichen, aber mit dem dunklen Modus funktioniert es nicht wirklich gut. Es erhält den Farbstil des aktuellen MacOS und verwendet statische. Aber eingebaut @IBDesignableund @IBInspectablealles funktioniert gut, also sollte es für den Zoll eine Möglichkeit geben, Color Assets auch im Dunkel- / Hell-Modus zu verwenden ~ weiß jemand, wie man das erreichen kann?
Nomad Developer

12

Sie können eine Erweiterung schreiben, um sie mit allen UIViews zu verwenden, z. UIButton, UILabel, UIImageView usw. Sie können meine folgende Methode gemäß Ihren Anforderungen anpassen, aber ich denke, sie wird für Sie gut funktionieren.

extension UIView{

    func setBorder(radius:CGFloat, color:UIColor = UIColor.clearColor()) -> UIView{
        var roundView:UIView = self
        roundView.layer.cornerRadius = CGFloat(radius)
        roundView.layer.borderWidth = 1
        roundView.layer.borderColor = color.CGColor
        roundView.clipsToBounds = true
        return roundView
    }
}

Verwendung:

btnLogin.setBorder(7, color: UIColor.lightGrayColor())
imgViewUserPick.setBorder(10)

1
@luda Ich glaube nicht, dass er / sie eine große Auswahl an der API-Sprache hat!
Worthwords

8

schnell 3

func borderColor(){

    self.viewMenuItems.layer.cornerRadius = 13
    self.viewMenuItems.layer.borderWidth = 1
    self.viewMenuItems.layer.borderColor = UIColor.white.cgColor
}

8

Swift 5.2 , UIView + Erweiterung

extension UIView {
    public func addViewBorder(borderColor:CGColor,borderWith:CGFloat,borderCornerRadius:CGFloat){
        self.layer.borderWidth = borderWith
        self.layer.borderColor = borderColor
        self.layer.cornerRadius = borderCornerRadius

    }
}

Sie haben diese Erweiterung verwendet.

yourView.addViewBorder(borderColor: #colorLiteral(red: 0.6, green: 0.6, blue: 0.6, alpha: 1), borderWith: 1.0, borderCornerRadius: 20)

Sie haben das Hinzufügen von clipsToBounds = true verpasst
Bent El-Eslam

3

Schreiben Sie den Code in Ihre viewDidLoad()

self.view.layer.borderColor = anyColor().CGColor

Und Sie können einstellen , ColormitRGB

func anyColor() -> UIColor {
    return UIColor(red: 0.0/255.0, green: 0.0/255.0, blue: 0.0/255.0, alpha: 1.0)
}

Erfahren Sie etwas über CALayerinUIKit


Irgendwie tut es nichts, wenn Sie nicht auch die Rahmenbreite explizit festlegen.
Nicolas Miari

@NicolasMiari das wäre zu erwarten ... Sie können keine Rahmenfarbe sehen, für die Sie keine Größe festgelegt haben.
Jono Guthrie

Entschuldigung, ich habe vergessen zu erwähnen, dass ich mich auf Textfelder beziehe ... die von Anfang an eine Standard-Randbreite ungleich Null zu haben scheinen. Ich hatte jedoch Mühe, die von mir eingestellte Farbe wiederzugeben, bis ich die Rahmenbreite explizit festlegte.
Nicolas Miari

3

schnell 3.0

self.uiTextView.layer.borderWidth = 0.5
    self.txtItemShortDes.layer.borderColor = UIColor(red:205.0/255.0, green:205.0/255.0, blue:205.0/255.0, alpha: 1.0).cgColor

3

Wir können eine Methode dafür erstellen. Verwenden Sie es einfach.

public func createBorderForView(color: UIColor, radius: CGFloat, width: CGFloat = 0.7) {
    self.layer.borderWidth = width
    self.layer.cornerRadius = radius
    self.layer.shouldRasterize = false
    self.layer.rasterizationScale = 2
    self.clipsToBounds = true
    self.layer.masksToBounds = true
    let cgColor: CGColor = color.cgColor
    self.layer.borderColor = cgColor
}

2

Swift 3.0

       groundTrump.layer.borderColor = UIColor.red.cgColor

Anstatt eine neue Antwort hinzuzufügen, müssen Sie eine Bearbeitungsanfrage an den ursprünglichen Antwortenden gesendet haben
Rajan Maheshwari

@ RajanMaheshwari Bitte nein. Fügen Sie den Antworten anderer Personen keinen Code hinzu. Updates sollten als eigene Updates veröffentlicht werden, nicht in anderen Antworten. Auf diese Weise ist jedes Poster für das verantwortlich, was sie veröffentlichen ...
Eric Aya

@EricAya Es geht nicht darum, die Antwort zu aktualisieren. Es handelt sich um eine Bearbeitungsanforderung, die möglicherweise in Kommentaren an den Antwortenden enthalten ist. Hast du bekommen, was ich zu vermitteln versuchte?
Rajan Maheshwari
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.