swift - serve - w3schools css border radius




Como faço para que um botão tenha uma borda arredondada no Swift? (9)

Estou criando um aplicativo usando o swift na versão mais recente do Xcode 6 e gostaria de saber como posso modificar meu botão para que ele tenha uma borda arredondada e que eu possa me ajustar, se necessário. Feito isso, como posso alterar a cor da borda sem adicionar um plano de fundo? Em outras palavras, quero um botão ligeiramente arredondado, sem fundo, apenas uma borda de 1 ponto de uma determinada cor.


Com base na resposta @returntrue, consegui implementá-lo no Interface Builder.

Para obter o botão cantos arredondados usando o Interface Builder, adicione um Key Path = "layer.cornerRadius" com Type = "Number" e Value = "10" (ou outro valor conforme necessário) no " User Defined RunTime Attribute " do Identity Inspector de Identity Inspector do o botão.


Criei uma sublcass UIButton simples que usa o tintColor para suas cores de texto e borda e, quando destacado, altera seu plano de fundo para o tintColor .

class BorderedButton: UIButton {

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    layer.borderWidth = 1.0
    layer.borderColor = tintColor.CGColor
    layer.cornerRadius = 5.0
    clipsToBounds = true
    contentEdgeInsets = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
    setTitleColor(tintColor, forState: .Normal)
    setTitleColor(UIColor.whiteColor(), forState: .Highlighted)
    setBackgroundImage(UIImage(color: tintColor), forState: .Highlighted)
}
}

Isso faz uso de uma extensão UIImage que cria uma imagem de uma cor. Encontrei o código aqui: https://.com/a/33675160

Funciona melhor quando definido para digitar Personalizado no construtor de interface, pois o tipo de sistema padrão modifica ligeiramente as cores quando o botão é destacado.


Eu acho que a maneira mais fácil e limpa de usar o protocolo é evitar a herança e a repetição de código. Você pode alterar essas propriedades diretamente do storyboard

protocol Traceable {
    var cornerRadius: CGFloat { get set }
    var borderColor: UIColor? { get set }
    var borderWidth: CGFloat { get set }
}

extension UIView: Traceable {

    @IBInspectable var cornerRadius: CGFloat {
        get { return layer.cornerRadius }
        set {
            layer.masksToBounds = true
            layer.cornerRadius = newValue
        }
    }

    @IBInspectable var borderColor: UIColor? {
        get {
            guard let cgColor = layer.borderColor else { return nil }
            return  UIColor(cgColor: cgColor)
        }
        set { layer.borderColor = newValue?.cgColor }
    }

    @IBInspectable var borderWidth: CGFloat {
        get { return layer.borderWidth }
        set { layer.borderWidth = newValue }
    }
}

Atualizar

Neste link você pode encontrar um exemplo com o utilitário do protocolo Rastreável


Eu acho que essa é a forma simples

        Button1.layer.cornerRadius = 10(Half of the length and width)
        Button1.layer.borderWidth = 2

Você pode subclassificar UIButton e adicionar variáveis @IBInspectable a ele para poder configurar os parâmetros do botão personalizado através do StoryBoard "Attribute Inspector". Abaixo, escrevo esse código.

@IBDesignable
class BHButton: UIButton {

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

    @IBInspectable lazy var isRoundRectButton : Bool = false

    @IBInspectable public var cornerRadius : CGFloat = 0.0 {
        didSet{
            setUpView()
        }
    }

    @IBInspectable public var borderColor : UIColor = UIColor.clear {
        didSet {
            self.layer.borderColor = borderColor.cgColor
        }
    }

    @IBInspectable public var borderWidth : CGFloat = 0.0 {
        didSet {
            self.layer.borderWidth = borderWidth
        }
    }

    //  MARK:   Awake From Nib

    override func awakeFromNib() {
        super.awakeFromNib()
        setUpView()
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        setUpView()
    }

    func setUpView() {
        if isRoundRectButton {
            self.layer.cornerRadius = self.bounds.height/2;
            self.clipsToBounds = true
        }
        else{
            self.layer.cornerRadius = self.cornerRadius;
            self.clipsToBounds = true
        }
    }

}

Você pode usar esta subclasse de UIButton para personalizar o UIButton conforme suas necessidades.

visite este repositório do github para referência

class RoundedRectButton: UIButton {

    var selectedState: Bool = false

    override func awakeFromNib() {
        super.awakeFromNib()
        layer.borderWidth = 2 / UIScreen.main.nativeScale
        layer.borderColor = UIColor.white.cgColor
        contentEdgeInsets = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5)
    }


    override func layoutSubviews(){
        super.layoutSubviews()
        layer.cornerRadius = frame.height / 2
        backgroundColor = selectedState ? UIColor.white : UIColor.clear
        self.titleLabel?.textColor = selectedState ? UIColor.green : UIColor.white
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        selectedState = !selectedState
        self.layoutSubviews()
    }
}

Experimente esta borda de botão com cantos arredondados

anyButton.backgroundColor = .clear

anyButton.layer.cornerRadius = anyButton.frame.height / 2

anyButton.layer.borderWidth = 1

anyButton.layer.borderColor = UIColor.black.cgColor

Para executar este trabalho no storyboard (Interface Builder Inspector)

Com a ajuda do IBDesignable , podemos adicionar mais opções ao Interface Builder Inspector for UIButton e ajustá-las no storyboard. Primeiro, adicione o seguinte código ao seu projeto.

@IBDesignable extension UIButton {

    @IBInspectable var borderWidth: CGFloat {
        set {
            layer.borderWidth = newValue
        }
        get {
            return layer.borderWidth
        }
    }

    @IBInspectable var cornerRadius: CGFloat {
        set {
            layer.cornerRadius = newValue
        }
        get {
            return layer.cornerRadius
        }
    }

    @IBInspectable var borderColor: UIColor? {
        set {
            guard let uiColor = newValue else { return }
            layer.borderColor = uiColor.cgColor
        }
        get {
            guard let color = layer.borderColor else { return nil }
            return UIColor(cgColor: color)
        }
    }
}

Em seguida, basta definir os atributos dos botões no storyboard.


@IBOutlet weak var button: UIButton!

...

Eu acho que por raio apenas este parâmetro:

button.layer.cornerRadius = 5






uibutton