Como definir a cor da borda personalizada do UIView programaticamente?

99

Estou tentando definir a cor da borda personalizada do UIView programaticamente em Swift.

Shashi Verma
fonte
3
Mostre o código relevante em sua pergunta. Explique qual problema você está tendo.
rmaddy
1
possível duplicata do Cocoa Touch: Como alterar a cor e a espessura da borda do UIView? você só precisa usá-lo de maneira rápida
Inder Kumar Rathore,

Respostas:

202

Se você usa Swift 2.0+

self.yourView.layer.borderWidth = 1
self.yourView.layer.borderColor = UIColor(red:222/255, green:225/255, blue:227/255, alpha: 1).cgColor
Shashi Verma
fonte
Nota: isso não pareceu funcionar para mim (talvez porque eu esteja no swift 3.1?). A versão de Paras Joshi ( stackoverflow.com/a/29701061/225813 ) funcionou
Ashley Coolman
Eu editei minha resposta. com certeza funcionará para você .. Ashley Coolman
Shashi Verma
1
Você não precisa chamar o init explicitamente no swift 3.
ibrahimab
É possível usar mais de uma cor?
Gökhan Çokkeçeci
3
Existe alguma diferença entre as suas duas versões?
Fogmeister
88

No Swift 4, você pode definir a cor e largura da borda para UIControls usando o código abaixo.

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 , você pode definir a largura e cor da borda do UIView usando o código abaixo.

yourView.layer.borderWidth = 1

yourView.layer.borderColor = UIColor.red.cgColor
Paras Joshi
fonte
1
@ShashiVerma de nada. Para maiores detalhes sobre as camadas, leia os documentos de referência de classe de diferentes objetos da apple, que também são úteis para você :)
Paras Joshi
16

Use @IBDesignable e @IBInspectable para fazer o mesmo.

Eles são reutilizáveis, facilmente modificáveis ​​no Interface Builder e as alterações são refletidas imediatamente no Storyboard

Adapte os objetos do storyboard à classe específica

Fragmento de código:

@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()
}

}

Permite fácil modificação do Interface Builder:

Interface Builder

Supratik Majumdar
fonte
Eu gosto mais dessa solução, pois é reutilizável, em que definimos o UIView como customview, mas ainda deixa espaço para mais alterações.
n0rm
Esta era minha maneira favorita de conseguir isso, mas com o modo escuro, realmente não funciona bem. Ele obtém o estilo de cor do MacOS atual e usa estática. Mas inclua @IBDesignablee @IBInspectabletudo funcione bem, então deve haver uma maneira para os costumes usarem recursos de cor com o modo claro / escuro também - alguém sabe como fazer isso?
Desenvolvedor Nomad de
12

Você pode escrever uma extensão para usá-lo com todos os UIViews, por exemplo. UIButton, UILabel, UIImageView etc. Você pode personalizar meu método a seguir de acordo com sua necessidade, mas acho que funcionará bem para você.

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
    }
}

Uso:

btnLogin.setBorder(7, color: UIColor.lightGrayColor())
imgViewUserPick.setBorder(10)
Shardul
fonte
1
@luda não acho que ele / ela tenha muita escolha sobre a linguagem da API!
worthwords
8

rápido 3

func borderColor(){

    self.viewMenuItems.layer.cornerRadius = 13
    self.viewMenuItems.layer.borderWidth = 1
    self.viewMenuItems.layer.borderColor = UIColor.white.cgColor
}
Deepak Tagadiya
fonte
8

Swift 5.2 , UIView + Extension

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

    }
}

Você usou esta extensão;

yourView.addViewBorder(borderColor: #colorLiteral(red: 0.6, green: 0.6, blue: 0.6, alpha: 1), borderWith: 1.0, borderCornerRadius: 20)
ikbal
fonte
você perdeu de adicionar clipsToBounds = true
Bent El-Eslam
3

Escreva o código em seu viewDidLoad()

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

E você pode definir ColorcomRGB

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

Aprenda algo sobre CALayeremUIKit

Ethan Joe
fonte
De alguma forma, ele não faz nada a menos que você defina explicitamente a largura da borda também.
Nicolas Miari
@NicolasMiari que seria de esperar ... você não pode ver uma cor de borda para a qual não definiu um tamanho.
Jono Guthrie
Desculpe, esqueci de mencionar que estava me referindo a campos de texto ... que parecem ter uma largura de borda diferente de zero padrão desde o início. No entanto, tive dificuldade para refletir a cor que defini, até definir explicitamente a largura da borda.
Nicolas Miari
3

Swift 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
fonte
3

Podemos criar um método para isso. Basta usá-lo.

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
}
Sr.Javed Multani
fonte
2

Swift 3.0

       groundTrump.layer.borderColor = UIColor.red.cgColor
Вадим Башуров
fonte
Em vez de adicionar uma nova resposta, você deve ter enviado uma solicitação de edição ao respondente original
Rajan Maheshwari
@RajanMaheshwari Por favor, não. Não adicione código às respostas de outras pessoas. As atualizações devem ser postadas como suas próprias, não em outras respostas. Dessa forma, cada postador é responsável pelo que postar ...
Eric Aya
@EricAya não se trata de atualizar a resposta. É um pedido de edição, pode ser nos comentários ao respondente. Você entendeu o que eu estava tentando transmitir.
Rajan Maheshwari