我在this guide之后使用.xib和cocoa类的组合实现了可重用的按钮组件
它有效,但有一个问题。为了在我的一个主视图故事板中使用它,我必须先在普通视图中拖动(在问题标题中引用为superview),然后应用我的Button
类,使其成为一个按钮。
这是有效的,但初始视图的高度和宽度以及它的白色背景仍然存在,所以当我使用我的组件时,我必须总是手动重写它们,这本身导致可重用性差。
理想情况下,我想拖动视图,将其设置为Button
类,就是这样,该视图应立即采用按钮的高度和宽度,并具有透明背景。这样的事情可以实现吗?
为了解决这个问题的更多背景,这里我的实现很少有用
1.可重用组件,作为.xib视图和自己的可可类
2. Button.swift
的内容
import UIKit
@IBDesignable class Button: UIView {
@IBOutlet var contentView: UIView!
@IBOutlet weak var label: UILabel!
@IBInspectable var buttonLabel: String? {
get {
return label.text
}
set(buttonLabel) {
label.text = buttonLabel
}
}
override init(frame: CGRect) {
super.init(frame: frame)
componentInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
componentInit()
}
private func componentInit() {
let bundle = Bundle(for: Button.self)
bundle.loadNibNamed("Button", owner: self, options: nil)
addSubview(contentView)
contentView.frame = self.bounds
contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
}
}
3.示例用法(在我的一个主视图故事板中)演示普通视图如何变成按钮,但是有高度,宽度和背景颜色的问题
P.S ^如果很难分辨出上面的gif中发生了什么,我基本上将UIView
拖入故事板并给它自定义类属性Button
,这将该视图转换为按钮。
编辑:为了使它更清楚,我的问题是:我可以将宽度,高度和透明颜色应用于我的XIB的父/超级视图吗?这里的最终目标是只是将视图拖到故事板上,给它自定义类Button
,就是这样,它应该正确调整大小并具有透明背景,而不是现在的情况(视图不会大小)作为按钮,有白色背景)
您必须正确地将您的子视图固定在Button中,也可以固定在Main.storyboard中。然后您的自定义视图将自动调整大小。清晰的颜色正在发挥作用。
import UIKit
@IBDesignable
class Button: UIView {
@IBOutlet var contentView: UIView!
@IBOutlet weak var label: UILabel!
@IBInspectable
var backColor: UIColor = .clear {
didSet {
backgroundColor = backColor
contentView.backgroundColor = backColor
}
}
override var backgroundColor: UIColor? {
get {
return backgroundColor
} set {
}
}
@IBInspectable
var buttonLabel: String? {
get {
return label.text
}
set(buttonLabel) {
label.text = buttonLabel
}
}
override init(frame: CGRect) {
super.init(frame: frame)
componentInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
componentInit()
}
private func componentInit() {
let bundle = Bundle(for: Button.self)
bundle.loadNibNamed("Button", owner: self, options: nil)
addSubview(contentView)
contentView.frame = bounds
backgroundColor = backColor
contentView.backgroundColor = backColor
contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
// for static height
contentView.heightAnchor.constraint(equalToConstant: 70).isActive = true
}
}
为了确保CustomView能够正确调整大小,您可以使用底部约束> = 0.将重置测试设置为等于。