我怎么能让一个按钮有一个圆形的边界在Swift?

我正在Xcode 6的最新版本中使用swift构建一个应用程序,我想知道如何修改我的按钮,使它可以有一个圆形的边界,如果需要,我可以调整自己。一旦完成,我如何改变边界本身的颜色而不添加背景?换句话说,我想要一个略圆的按钮,没有背景,只有一个特定颜色的1pt边界。

370447 次浏览

使用button.layer.cornerRadiusbutton.layer.borderColorbutton.layer.borderWidth。 注意,borderColor需要CGColor,所以你可以说(Swift 3/4):

button.backgroundColor = .clear
button.layer.cornerRadius = 5
button.layer.borderWidth = 1
button.layer.borderColor = UIColor.black.cgColor

我已经创建了一个简单的UIButton子模块,它的文本和边框颜色使用tintColor,当突出显示时,它的背景更改为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)
}
}

这使用了一个UIImage扩展,从一个颜色创建一个图像,我发现代码在这里:https://stackoverflow.com/a/33675160

当在界面构建器中设置为自定义类型时,它工作得最好,因为默认的系统类型会在按钮突出显示时略微修改颜色。

这个类是基于所有的评论和建议的答案,也可以直接从xcode设计。复制到你的项目并插入任何UIButton并更改为使用自定义类,现在只需从xcode中选择正常和/或高亮显示状态的边框或背景颜色。

//
//  RoundedButton.swift
//


import UIKit


@IBDesignable
class RoundedButton:UIButton {


@IBInspectable var borderWidth: CGFloat = 0 {
didSet {
layer.borderWidth = borderWidth
}
}
//Normal state bg and border
@IBInspectable var normalBorderColor: UIColor? {
didSet {
layer.borderColor = normalBorderColor?.CGColor
}
}


@IBInspectable var normalBackgroundColor: UIColor? {
didSet {
setBgColorForState(normalBackgroundColor, forState: .Normal)
}
}




//Highlighted state bg and border
@IBInspectable var highlightedBorderColor: UIColor?


@IBInspectable var highlightedBackgroundColor: UIColor? {
didSet {
setBgColorForState(highlightedBackgroundColor, forState: .Highlighted)
}
}




private func setBgColorForState(color: UIColor?, forState: UIControlState){
if color != nil {
setBackgroundImage(UIImage.imageWithColor(color!), forState: forState)


} else {
setBackgroundImage(nil, forState: forState)
}
}


override func layoutSubviews() {
super.layoutSubviews()


layer.cornerRadius = layer.frame.height / 2
clipsToBounds = true


if borderWidth > 0 {
if state == .Normal && !CGColorEqualToColor(layer.borderColor, normalBorderColor?.CGColor) {
layer.borderColor = normalBorderColor?.CGColor
} else if state == .Highlighted && highlightedBorderColor != nil{
layer.borderColor = highlightedBorderColor!.CGColor
}
}
}


}


//Extension Required by RoundedButton to create UIImage from UIColor
extension UIImage {
class func imageWithColor(color: UIColor) -> UIImage {
let rect: CGRect = CGRectMake(0, 0, 1, 1)
UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, 1), false, 1.0)
color.setFill()
UIRectFill(rect)
let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}

基于@returntrue答案,我设法在接口生成器中实现它。

要使用Interface Builder获得圆角按钮,在按钮的Identity Inspector的“User Defined RunTime Attribute”中添加一个带有Type = "Number"Value = "10"(或其他所需值)的键Path = "layer.cornerRadius"

我认为最简单和最干净的方法是使用协议来避免继承和代码重复。 您可以从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 }
}
}

更新

在这个链接中,你可以找到一个使用Traceable协议的实用程序的例子

enter image description here

要在故事板中完成这项工作(接口构建器检查器)

IBDesignable的帮助下,我们可以为UIButton的接口构建器检查器添加更多选项,并在故事板上调整它们。首先,将以下代码添加到项目中。

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

然后简单地设置storyboard上按钮的属性。

enter image description here

你可以使用UIButton的子类来根据你的需要定制UIButton。

Visit this github repo for reference

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()
}
}
@IBOutlet weak var button: UIButton!

...

我认为对于半径来说,这个参数足够了:

button.layer.cornerRadius = 5
@IBOutlet weak var yourButton: UIButton! {
didSet{
yourButton.backgroundColor = .clear
yourButton.layer.cornerRadius = 10
yourButton.layer.borderWidth = 2
yourButton.layer.borderColor = UIColor.white.cgColor
}
}

作为另一个提示,确保你的按钮不是任何自定义类的子类在故事板,在这种情况下,你的代码最好的地方应该在自定义类它自己的原因代码只出自定义类,如果你的按钮是默认UIButton类的子类和它的出口,希望这可能有助于任何人想知道为什么角收音机不适用于我的按钮从代码。

你可以子类化UIButton并添加@IBInspectable变量,这样你就可以通过StoryBoard的“属性检查器”配置自定义按钮参数。下面我写下代码。

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


}

< >强试试这个 圆角按钮边框

anyButton.backgroundColor = .clear


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


anyButton.layer.borderWidth = 1


anyButton.layer.borderColor = UIColor.black.cgColor

我认为这是简单的形式

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


@IBDesignable
class RoundedButton: UIButton {
    

@IBInspectable var cornerRadius: CGFloat = 8
@IBInspectable var borderColor: UIColor? = .lightGray
    

override func draw(_ rect: CGRect) {
layer.cornerRadius = cornerRadius
layer.masksToBounds = true
layer.borderWidth = 1
layer.borderColor = borderColor?.cgColor
        

}
    

    

}

它是UIButton圆角边框的全局方法

class func setRoundedBorderButton(btn:UIButton)
{
btn.layer.cornerRadius = btn.frame.size.height/2
btn.layer.borderWidth = 0.5
btn.layer.borderColor = UIColor.darkGray.cgColor
}

UIBuilder爱好者的解决方案:

  1. 检查UIButton的“属性检查器”中的“剪辑到边界”复选框;窗口。[见下图1]

  2. 点击“身份检查器”,并点击“+”符号进入一个新的关键路径:层。角半径,数字,8(或16等…) [见下图2]

    .
图1:剪辑到边界复选框 图1:剪辑到边界复选框 . < / p > 图2:Key Path code… 图2:Key Path code . < / p > 图3:合成图像按钮 图3:合成图像-按钮 < / p >