swift - serve - w3schools css border radius
Como faço para que um botão tenha uma borda arredondada no Swift? (9)
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.
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.
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