【在 iOS 开发路上的大小事-Day10】为你的 UIButton 进行客制化吧!

一般在设定 UIButton 的时候,可能会设定文字颜色、背景色、阴影颜色等属性
那如果要设定按钮外观、按钮框线颜色、按钮框线宽度等其他属性的话,可能就要透过 Code 来处理

假设只有一个按钮的话,那可能只要设定一次就好
那如果有很多按钮都要这样做的话,有点太花时间了

所以我们可以透过写一次 Code,然後套用在每个有这种需求的 Button 上,所以下面就开始吧~

开始实作罗

先新增一个 Swift 档案,选 Cocoa Touch Class

class 就自己取就可以了,Subclass 选 UIButton

目前应该会长这样

import Foundation
import UIKit

class CustomButton: UIButton {

}

接着我们可以透过 @IBInspectable 这个属性的定义来让按钮可以在介面建构器里进行客制化设定
像是 cornerRadius、borderWidth、borderColor 等这些没有出现在介面建构器上的选项
都可以透过这个方式来新增出来,让我们可以方便设定

但要注意一下,只有下面这几种属性可以透过 @IBInspectable 的方式新增喔

  • Int
  • Double
  • String
  • Bool
  • CGFloat
  • CGPoint
  • CGSize
  • CGRect
  • UIColor
  • UIImage

下面会以 cornerRadius、borderWidth、borderColor 这三个来做示范

class CustomButton: UIButton {
    // MARK:- UIButton 圆角设定
    @IBInspectable var cornerRadius: CGFloat = 0.0 {
        didSet {
            layer.cornerRadius = cornerRadius
            layer.masksToBounds = cornerRadius > 0
        }
    }
    
    // MARK:- UIButton 框线设定
    // 框线宽度
    @IBInspectable var borderWidth: CGFloat {
        get {
            return layer.borderWidth
        } set {
            layer.borderWidth = newValue
        }
    }
    
    // 框线颜色
    @IBInspectable var borderColor: UIColor {
        get {
            return UIColor(cgColor: layer.borderColor!)
        } set {
            layer.borderColor = newValue.cgColor
        }
    }
}

接着,点想要套用的 Button,将他的 class 改为刚刚新增的 Swift 档案里面的 class 名称
以我的为例的话就是 CustomButton

接着就可以看到刚刚新增的 cornerRadius、borderWidth、borderColor 这三个选项了

虽然现在算是用好了,但如果要看到实际变化的话,还是得 Build 到模拟器或是手机/平板上才可以

这时候我们可以透过 @IBDesignable 这个属性的定义,将其加在 class 的前面
就可以让我们可以在不执行的情况下,就看到按钮的改变

下面是本篇的完整程序码

import Foundation
import UIKit

@IBDesignable class CustomButton: UIButton {
    // MARK:- UIButton 圆角设定
    @IBInspectable var cornerRadius: CGFloat = 0.0 {
        didSet {
            layer.cornerRadius = cornerRadius
            layer.masksToBounds = cornerRadius > 0
        }
    }
    
    // MARK:- UIButton 框线设定
    // 框线宽度
    @IBInspectable var borderWidth: CGFloat {
        get {
            return layer.borderWidth
        } set {
            layer.borderWidth = newValue
        }
    }
    
    // 框线颜色
    @IBInspectable var borderColor: UIColor {
        get {
            return UIColor(cgColor: layer.borderColor!)
        } set {
            layer.borderColor = newValue.cgColor
        }
    }
}

好的,今天介绍的是比较偏向可以重复使用的小技巧,明天见~


<<:  [第07天]理财达人Mx. Ada-删单作业

>>:  如何设定 KPI 与 Goal

Day23 ( 高级 ) 仙女棒 ( 光迹效果 )

仙女棒 ( 光迹效果 ) 教学原文参考:仙女棒 ( 光迹效果 ) 这篇文章会介绍,如何在 Scrat...

Day 29 - ROS 树莓派光达履带小车实作 (3)

昨天把lidar配置完成,并且准备好做SLAM的工具,但还有一个最重要的功能就是,让车子动起来~~ ...

每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day19

tags: ItIron2021 Javascript 前言 终於用了4天的时间把this相关的题型...

Day 22 - Rancher Fleet 架构介绍

本文将於赛後同步刊登於笔者部落格 有兴趣学习更多 Kubernetes/DevOps/Linux 相...

[Day 27] - React 前端串後端 - Cookie存取

目前在浏览器储存使用者资料的主流方式有两种, 一种是存local storage、一种是存在Cook...