Wie kann ich die benutzerdefinierte Rahmenfarbe von UIView programmgesteuert festlegen?

99

Ich versuche, die benutzerdefinierte Rahmenfarbe von UIView programmgesteuert in Swift festzulegen.

Shashi Verma
quelle
3
Zeigen Sie den relevanten Code in Ihrer Frage. Erklären Sie, welches Problem Sie haben.
rmaddy
1
Mögliches Duplikat von Cocoa Touch: Wie ändere ich die Rahmenfarbe und -stärke von UIView? Sie müssen es nur schnell verwenden
Inder Kumar Rathore

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
Shashi Verma
quelle
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
Paras Joshi
quelle
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

Supratik Majumdar
quelle
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)
Shardul
quelle
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
}
Deepak Tagadiya
quelle
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)
ikbal
quelle
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

Ethan Joe
quelle
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
Chathura Jayanaka
quelle
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
}
Mr.Javed Multani
quelle
2

Swift 3.0

       groundTrump.layer.borderColor = UIColor.red.cgColor
Вадим Башуров
quelle
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