我正在使用 UITextField
和 UIButton
的自定义子类 - MyTextField
和 MyButton
。
在这两种情况下,我都以这种方式创建圆边:
var round = true
override func layoutSublayers(of layer: CALayer) {
super.layoutSublayers(of: layer)
layer.cornerRadius = round ? self.frame.height/5.0 : 0
}
我试图找到一些通用的方法来使两个类都具有 round
字段并覆盖 layoutSublayers(...)
。有什么方法比在每个类中粘贴相同的代码更好?
最佳答案
或者,如果您想要一种真正灵活的方式,您可以使用 View 样式概念。下面是您可以开始的简单实现:
typealias Style<T> = (T) -> Void
extension UIView {
convenience init<V: UIView>(with styles: [Style<V>]) {
self.init(frame: .zero)
guard let view = self as? V else {
assertionFailure("Could not apply style for \(V.self) to \(type(of: self))")
return
}
styles.forEach { $0(view) }
}
}
然后声明一些样式表
enum ViewStyle {
static func rounded(radius: CGFloat) -> Style<UIView> {
return { view in
view.layer.cornerRadius = radius
view.clipsToBounds = true
}
}
static let lightGray: Style<UIView> = { view in
view.backgroundColor = .lightGray
}
}
像这样使用它
let button = UIButton(with: [ViewStyle.rounded(radius: 5.0)])
let textField = UITextField(with: [
ViewStyle.rounded(radius: 8.0),
ViewStyle.lightGray
])
它允许您重用预定义样式并混合它们以实现更复杂的设置,而无需创建自己的自定义子类。当然,这只是可以做的事情的一小部分,我鼓励你更深入:)
关于ios - Swift - 在 UIView 的两个子类中重写一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54679893/