Ios 自定义类上的圆形按钮,具有UI外观

Ios 自定义类上的圆形按钮,具有UI外观,ios,swift,uibutton,uiappearance,Ios,Swift,Uibutton,Uiappearance,我正在尝试使用UIAppearance()在自定义类上应用样式 使用代码: let buttonView = MainStyleButton.appearance() buttonView.backgroundColor = Style.buttonColor buttonView.layer.cornerRadius = 5 buttonView.layer.borderWidth = 5 buttonView.layer.borderColor = Style.buttonColor.cgC

我正在尝试使用UIAppearance()在自定义类上应用样式

使用代码:

let buttonView = MainStyleButton.appearance()
buttonView.backgroundColor = Style.buttonColor
buttonView.layer.cornerRadius = 5
buttonView.layer.borderWidth = 5
buttonView.layer.borderColor = Style.buttonColor.cgColor
它与颜色配合使用,但不幸的是我的按钮不圆。如果有任何提示,我将不胜感激。
在装有iOS 11.2的模拟机iPhone X、8上进行了测试。

我尝试复制您的方法并设置了一个按钮。在
viewdiload
期间,我尝试在
UIViewController
中更改按钮的外观,并且在
applicationdFinishLaunching
期间,我尝试在
AppDelegate
中使用您的代码更改按钮的外观。我还测试了将按钮类型从默认类型
.system
更改为
.custom
。所有这些似乎都不起作用,我无法覆盖您无法覆盖的相同属性

据我所知,按钮类型定义了其外观以及哪些外观属性可以被覆盖:

按钮的类型定义其基本外观和行为。您可以在创建时使用init(type:)方法或在脚本文件中指定按钮的类型。创建按钮后,不能更改其类型

我不知道为什么你感兴趣的属性在这一点上是不可变的


但是,我想提供一种我个人使用的不同方法,允许您更改按钮的外观。由于您已经定义了自定义类,因此定义角半径和其他您想要的属性要简单得多,就像这样(或者您可以编写一个带有参数的样式函数,可以随时调用,以便能够根据按钮的使用位置更改外观):

或者,您可以为系统按钮实例化/使用IBOutlet并执行以下操作:

class MyViewController: UIViewController {
  @IBOutlet weak var myButton: UIButton!
  override func viewDidLoad() {
    super.viewDidLoad()
    // not necessary to do this is viewDidLoad, that's just my example
    myButton.layer.borderColor = Style.buttonColor.cgColor
    myButton.layer.cornerRadius = 5
    myButton.layer.borderWidth = 5
}

首先,非常感谢你给出了广泛而清晰的答案。我试过你的方法,它确实有效。这仅仅是因为我试图在代码中坚持使用样式指南的一个源代码,实际上直到现在为止,我还没有缺少任何UIAppearance()函数。似乎你不可能在一个地方做所有事情:(
class MainStyleButton: UIButton {
  override func awakeFromNib() {
    layer.borderColor = Style.buttonColor.cgColor
    layer.borderWidth = 5
    layer.cornerRadius = 5
  }
}
class MyViewController: UIViewController {
  @IBOutlet weak var myButton: UIButton!
  override func viewDidLoad() {
    super.viewDidLoad()
    // not necessary to do this is viewDidLoad, that's just my example
    myButton.layer.borderColor = Style.buttonColor.cgColor
    myButton.layer.cornerRadius = 5
    myButton.layer.borderWidth = 5
}