用于重用的自定义 UIButton 类

Posted

技术标签:

【中文标题】用于重用的自定义 UIButton 类【英文标题】:Custom UIButton Class for Reuse 【发布时间】:2015-05-30 17:56:54 【问题描述】:

在网上找了一段时间了,还没有得到关于如何做到这一点的直接答案。

在我的应用程序中,我需要一个驻留在许多 ViewController 上的“下一步”按钮。我希望这个下一个按钮是相同的(有边框、相同的背景颜色、相同的自定义字体、相同的字体大小、相同的按钮大小)。

//Next Button Properties
[self.nextButtonOutlet setFrame:CGRectMake(120, 454, 80, 30)];
[[self.nextButtonOutlet layer] setBorderWidth:2.0f];
[[self.nextButtonOutlet layer] setBorderColor:UIColorFromRGB(0xbbffd6).CGColor];
self.nextButtonOutlet.titleLabel.font = [UIFont fontWithName:@"GothamRnd-Light" size:22.0];
[self.nextButtonOutlet setTitle:@"next" forState:UIControlStateNormal];
[self.nextButtonOutlet setBackgroundColor:UIColorFromRGB(0x72CE97)];
[self.nextButtonOutlet setTitleColor:UIColorFromRGB(0xbbffd6) forState:UIControlStateNormal];

在每个视图控制器中编写所有这些代码似乎很愚蠢。

谁有办法解决这个问题?

【问题讨论】:

【参考方案1】:

您可以为 UIButton 创建一个扩展并添加一个返回自定义 UIButton 的新方法。

在objective-c中:

+ (UIButton *)nextButton 
    // Create and return your button here

或在 Swift 中:

extension UIButton 
    class func nextButton() -> UIButton 
        // Create and return your button here

     return nextButton()
    

然后使用以下方法创建它:

UIButton.nextButton()

【讨论】:

应该返回按钮,而不是 Swift 示例中的函数?例如。返回 tempButton,而不是返回 nextButton()?【参考方案2】:
class ReusableButton: UIButton 

override init(frame: CGRect) 
    super.init(frame: frame)
    self.layer.borderWidth = 1
    self.layer.borderColor = UIColor.lightGray.cgColor
    self.backgroundColor = .blue
    self.titleLabel?.font = UIFont(name: "fontName", size: fontSize)
    self.setTitle(title: "save", for: .normal)


required init?(coder aDecoder: NSCoder) 
    fatalError("init(coder:) has not been implemented")


现在在创建新按钮时,您只需声明

var myBtn = ReusableButton()

希望这会有所帮助。快乐编码:]

【讨论】:

【参考方案3】:

有一些选择。

使用界面生成器。您可以轻松地多次复制粘贴现有按钮,但以后将很难更改并应用到任何地方。相反,您可以将按钮存储在 xib 中并加载它。因此,一旦您更改了某些属性,在下一次构建时,您将更新所有按钮。 使用hack like this 复制实例化视图 创建一个包含所有创建逻辑的 UI 工厂类。

为此我更喜欢单独的 xib,尤其是对于具有丰富动画的按钮。

【讨论】:

不要认为我可以使用 InterfaceBuilder,因为我有自定义字体。可能是错的。自定义字体的新手也 自定义字体在 IB 上是可以的,我也使用自定义字体,但您需要定义类别。我用那个github.com/samwize/UIView-CustomFonts/blob/master/Classes/… 所以我只是在字符串类型的按钮(标签、文本字段等)上定义自定义属性fontFamily 并在那里传递字体名称。

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

如何为数组中的每个创建一个具有唯一图像和选择器的自定义 UIButton?

UIButton 的自定义类视图

iPhone上的自定义相机工具栏

带有图像的自定义 UIButton

UIscrollview中的自定义UIButton

带有 PureLayout 的自定义 UIButton