【问题标题】:How do I simplify this long UIbutton code?如何简化这个长 UIbutton 代码?
【发布时间】:2021-01-09 23:54:06
【问题描述】:

我尝试创建 5 个 UIbutton(实际上是 12 个,但代码太长,所以我剪成 5 个。都是一样的)并使其角变圆并添加阴影

但我认为有更好的方法来简化这个长代码

请帮忙。谢谢

类视图控制器:UIViewController {

@IBOutlet weak var button: UIButton!
@IBOutlet weak var button2: UIButton!
@IBOutlet weak var button3: UIButton!
@IBOutlet weak var button4: UIButton!
@IBOutlet weak var button5: UIButton!

override func viewDidLoad() {
    super.viewDidLoad()
       
    button.layer.cornerRadius = 35
    button.layer.shadowRadius = 5
    button.layer.shadowColor = UIColor.black.cgColor
    button.layer.shadowOpacity = 0.5
    button.layer.shadowOffset = CGSize(width:0, height:1)
    button.layer.masksToBounds = false
    
    button2.layer.cornerRadius = 35
    button2.layer.shadowRadius = 5
    button2.layer.shadowColor = UIColor.black.cgColor
    button2.layer.shadowOpacity = 0.5
    button2.layer.shadowOffset = CGSize(width:0, height:1)
    button2.layer.masksToBounds = false
    
    button3.layer.cornerRadius = 35
    button3.layer.shadowRadius = 5
    button3.layer.shadowColor = UIColor.black.cgColor
    button3.layer.shadowOpacity = 0.5
    button3.layer.shadowOffset = CGSize(width:0, height:1)
    button3.layer.masksToBounds = false
    
    button4.layer.cornerRadius = 35
    button4.layer.shadowRadius = 5
    button4.layer.shadowColor = UIColor.black.cgColor
    button4.layer.shadowOpacity = 0.5
    button4.layer.shadowOffset = CGSize(width:0, height:1)
    button4.layer.masksToBounds = false
    
    button5.layer.cornerRadius = 35
    button5.layer.shadowRadius = 5
    button5.layer.shadowColor = UIColor.black.cgColor
    button5.layer.shadowOpacity = 0.5
    button5.layer.shadowOffset = CGSize(width:0, height:1)
    button5.layer.masksToBounds = false

【问题讨论】:

  • 为什么不只是子类 UIButton?
  • 我想学习如何做到这一点。

标签: ios swift xcode uibutton


【解决方案1】:

也许你可以在 swift 5.3 中使用可变参数来试试这个

@IBOutlet weak var button: UIButton!
@IBOutlet weak var button2: UIButton!
@IBOutlet weak var button3: UIButton!
@IBOutlet weak var button4: UIButton!
@IBOutlet weak var button5: UIButton!

//...
func configure(buttons: UIButton...) {
    for button in buttons {
        button.layer.cornerRadius = 35
        button.layer.shadowRadius = 5
        button.layer.shadowColor = UIColor.black.cgColor
        button.layer.shadowOpacity = 0.5
        button.layer.shadowOffset = CGSize(width:0, height:1)
        button.layer.masksToBounds = false
    }
}
configure(button, button1, button2, button3, button4, button5)

【讨论】:

    【解决方案2】:

    创建一个函数来完成重复性工作。像这样的:

    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var button2: UIButton!
    @IBOutlet weak var button3: UIButton!
    @IBOutlet weak var button4: UIButton!
    @IBOutlet weak var button5: UIButton!
    
    //...
    func configure(button: UIButton) {
        button.layer.cornerRadius = 35
        button.layer.shadowRadius = 5
        button.layer.shadowColor = UIColor.black.cgColor
        button.layer.shadowOpacity = 0.5
        button.layer.shadowOffset = CGSize(width:0, height:1)
        button.layer.masksToBounds = false
    }
    
    [button, button2, button3, button4, button5].forEach { configure(button:$0) }
    

    【讨论】:

    • 像魔术一样工作!谢谢你。 Xcode 还告诉我添加 { configure(button: $0) } 否则会出错。我的屏幕现在干净多了:D
    • 很高兴我能帮上忙。是的,我错过了按钮参数上的标签。现在你应该查找 Array.forEach 函数并练习使用它,直到你“得到它”。挺好用的。
    • 您可以使用的另一个增强功能是 IBOutletCollection 。这是 IBOutlet 的一种特殊形式,它创建一个包含您在 Interface Builder 中拖入其中的每个视图对象的数组。然后不必说[button, button2...],而是创建一个名为按钮的IBOutletCollection,控制并拖动所有按钮到其中,​​然后说buttons.forEach{<code>}
    • 哇,你的方法和描述很容易理解。多谢。我将尝试使用 Array.forEach 和 IBOutletCollection 来进一步了解。
    【解决方案3】:

    您始终可以继承 UIButton 并创建自己的自定义按钮:

    class CustomButton: UIButton {
        override init(frame: CGRect) {
            super.init(frame: frame)
            setup()
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            setup()
        }
    
        func setup() {
            layer.cornerRadius = 35
            layer.shadowRadius = 5
            layer.shadowColor = UIColor.black.cgColor
            layer.shadowOpacity = 0.5
            layer.shadowOffset = CGSize(width:0, height:1)
            layer.masksToBounds = false
        }
    }
    
    @IBOutlet weak var button: CustomButton!
    @IBOutlet weak var button2: CustomButton!
    @IBOutlet weak var button3: CustomButton!
    @IBOutlet weak var button4: CustomButton!
    @IBOutlet weak var button5: CustomButton!
    

    【讨论】:

    • 请注意,如果按钮是在故事板或 XIB 中创建的,您的代码将不起作用。 (在这些情况下,init(coder:) 方法被调用。我通常创建一个共享的setup() 方法,我从init(frame:)init(coder:) 调用它。这样我可以在代码中或从情节提要中调用我的视图对象和获得相同的行为(并且不必在 2 个地方维护相同的设置代码。)
    • @DuncanC 你是 100% 正确的,我的大部分观点都是以编程方式完成的,所以只是出于习惯的一个小小的疏忽。我会尽快更新我的答案。
    • 感谢您提供另一个视角。我刚开始写代码,现在这对我来说太先进了 XD
    【解决方案4】:

    创建一个方法并调用它很简单

    [button,button2].forEach({self.createButton($0)})
    
    func createButton(_ button: UIButton, radius: CGFloat = 35, shadowRadius: CGFloat = 5, shadowColor: UIColor = UIColor.black, shadowOpacity: Float = 0.5, shadowOffSet: CGSize = CGSize(width: 0, height: 1)){
        
        button.layer.cornerRadius = radius
        button.layer.shadowRadius = shadowRadius
        button.layer.shadowColor = shadowColor.cgColor
        button.layer.shadowOpacity = shadowOpacity
        button.layer.shadowOffset = shadowOffSet
        button.layer.masksToBounds = false
        
    }
    

    【讨论】:

    • 很好地使用默认参数值。这是另一种有用的学习技巧。 (已投票)
    【解决方案5】:

    你可以简单地使用数组

    [button1,button2..].forEach { button in
        button.layer.cornerRadius = 35
        button.layer.shadowRadius = 5
        button.layer.shadowColor = UIColor.black.cgColor
        button.layer.shadowOpacity = 0.5
        button.layer.shadowOffset = CGSize(width:0, height:1)
        button.layer.masksToBounds = false
    }
    

    或者使用方法,如果你需要为不同的按钮传递不同的参数

    setupButton(button1)
    setupButton(button2)
    
    func setupButton(_ button: UIButton) {
        button.layer.cornerRadius = 35
        button.layer.shadowRadius = 5
        button.layer.shadowColor = UIColor.black.cgColor
        button.layer.shadowOpacity = 0.5
        button.layer.shadowOffset = CGSize(width:0, height:1)
        button.layer.masksToBounds = false
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2012-03-08
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多