Swift:UIButton 自定义

Posted

技术标签:

【中文标题】Swift:UIButton 自定义【英文标题】:Swift: UIButton Customization 【发布时间】:2016-05-31 04:33:24 【问题描述】:

作为最佳实践,我想将自定义 UIButtons 的代码从我的 viewcontroller 类中移出。我下面的代码是为UIButtons 添加一个白色边框,我想在整个项目的按钮上轻松调用它。

    //White Border
    let passwordBorder = CALayer()

    let width = CGFloat(5.0)

    passwordBorder.borderColor = UIColor.whiteColor().CGColor

    passwordBorder.frame = CGRect(x: 0, y: 0, width:  passwordField.frame.size.width, height: passwordField.frame.size.height)

    passwordBorder.borderWidth = width

    passwordField.layer.addSublayer(passwordBorder)

    passwordField.layer.masksToBounds = true

如何将此代码放入辅助函数中以便我可以轻松调用它?

我是编码新手,在 UI 的任何东西上都遇到了帮助函数的问题。谢谢!

【问题讨论】:

您希望按钮的自定义类型 创建一个函数,该函数返回您想要重用代码的带边框按钮 你可以看看这个答案:***.com/a/27645782/6080920 【参考方案1】:

看看 Swift 的扩展。你可以很容易地做类似的事情

extension UIButton 
      func setPasswordBorderColor(borderColor: UIColor) 
        //White Border
        let passwordBorder = CALayer()

        let width = CGFloat(5.0)

        passwordBorder.borderColor = borderColor.CGColor

        passwordBorder.frame = CGRect(x: 0, y: 0, width:  self.frame.size.width, height: self.frame.size.height)

        passwordBorder.borderWidth = width

        self.layer.addSublayer(passwordBorder)

        self.layer.masksToBounds = true
  

【讨论】:

【参考方案2】:
import UIKit


// 
@IBDesignable
class CustomBorderButton: UIButton  

    @IBInspectable var cornerRadius: CGFloat = 0 
        didSet 
            layer.cornerRadius = cornerRadius
            layer.masksToBounds = cornerRadius > 0
        
    
    @IBInspectable var borderWidth: CGFloat = 0 
        didSet 
            layer.borderWidth = borderWidth
        
    
    @IBInspectable var borderColor: UIColor? 
        didSet 
            layer.borderColor = borderColor?.CGColor
        
    

【讨论】:

【参考方案3】:

无需代码即可配置按钮

选择您的按钮,然后选择身份检查器,然后添加

“用户定义的运行时属性”。查看屏幕截图了解更多详情

在您的项目中添加 CALayer+XibConfiguration.h & CALayer+XibConfiguration.m

对于 CALayer+XibConfiguration 打开这个link 并下载 CALayer+XibConfiguration

【讨论】:

【参考方案4】:

有几种方法可以实现这一点,例如使用类别、子类化UIButton,或在类中创建函数(可能是所有其他类继承的基类。)等。

通过使用你可以做的功能

func cutomizeButton(frame : CGRect, title : String) -> UIButton 

    let button : UIButton = UIButton(type: .Custom)

    button.frame = frame
    button.layer.borderWidth = 5.0
    button.layer.borderColor = UIColor.whiteColor().CGColor;
    button.layer.masksToBounds = true

    button.titleLabel?.text = title;

    //do other stuff

    return button;

【讨论】:

【参考方案5】:

在辅助类中制作方法

func customiseButton(button:UIButton)
        //White Border
        let passwordBorder = CALayer()

        let width = CGFloat(5.0)

        passwordBorder.borderColor = UIColor.whiteColor().CGColor

        passwordBorder.frame = CGRect(x: 0, y: 0, width:  button.frame.size.width, height: button.frame.size.height)

        passwordBorder.borderWidth = width

        button.layer.addSublayer(passwordBorder)

        button.layer.masksToBounds = true
    

在 ViewController 中调用这个方法

HelperClass().customiseButton(passwordField)

【讨论】:

【参考方案6】:

你可以试试这个圆形按钮的扩展:

extension UIButton
          func roundCorners(corners:UIRectCorner, radius: CGFloat)
                   let borderLayer = CAShapeLayer()
                   borderLayer.frame = self.layer.bounds
                   borderLayer.strokeColor = UIColor.green.cgColor
                   borderLayer.fillColor = UIColor.clear.cgColor
                   borderLayer.lineWidth = 10.5
                   let path = UIBezierPath(roundedRect: self.bounds,
                            byRoundingCorners: corners,
                            cornerRadii: CGSize(width: radius, height: radius))
                   borderLayer.path = path.cgPath
                   self.layer.addSublayer(borderLayer)
     

【讨论】:

以上是关于Swift:UIButton 自定义的主要内容,如果未能解决你的问题,请参考以下文章

从数组中设置自定义单元格 uibutton 标题 - Swift

UIButton 不适用于自定义 UITableViewCell (Swift)

通过扩展 UIButton 类使用 Swift 创建自定义按钮

更改自定义 UIButton 的 TitleColor (iOS 8 + swift)

在 Swift 2.0 中自定义 UIButton 外观

Swift 3 - 自定义 UIButton 半径删除约束?