ios - Swift:有没有办法让只有某些子类才能访问超类的扩展
问题描述
我目前正处于一个项目的开始阶段,并试图为 UIViews、UIButtons 和 UIImageViews 制作一些通用的可检查/可设计变量,以使 InterfaceBuilder 中的设计更容易。例如:
@IBInspectable
var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
}
}
我看到的一个建议是:
extension UIView {
@IBInspectable
var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
}
}
}
但是,问题在于,现在UIView 的所有子类都显示了可检查的属性,当我只在可能三个类上使用这些属性时,这是有问题的,并且我添加了更多属性,如边框宽度/颜色、阴影半径、不透明度、偏移量和颜色,这些在 IB 中占用了大量的检查器窗格。
我想要这样的东西:
@IBDesignable class MyView: UIView, MyDesignable {}
@IBDesignable class MyButton: UIButton, MyDesignable {}
@IBDesignable class MyImageView: UIImageView, MyDesignable {}
protocol MyDesignable {}
extension MyDesignable where Self: UIView {
@IBInspectable
var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
}
}
...
不幸的是,@IBInspectable
引发了错误Only instance properties can be declared @IBInspectable
。
我也试过:
@IBDesignable class MyView: UIView {}
@IBDesignable class MyButton: UIButton {}
@IBDesignable class MyImageView: UIImageView {}
private extension UIView {
@IBInspectable
var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
}
}
...
}
但是,其他 UIView 子类仍然显示可检查的属性。
希望它背后的问题和意图是有意义的。如果您有任何建议,请告诉我。谢谢!
解决方案
推荐阅读
- ruby-on-rails - Carrierwave 不在 Rails 5 中保存图像
- docker - Traefik 无法使用 Route 53 获取 Acme 证书
- c# - C# 是否使用公共方法来访问私有属性?
- c# - 将 C# 中的空 DateTime 插入 FoxPro
- firebase - Firebase 实时数据库现在是否明确需要 Google Play 服务?
- html - Rmarkdown (html): 在 html 上为用户创建文本/评论框
- java - 如何在 JavaExec 任务类路径中包含插件依赖项?
- javascript - 承诺在节点 module.exports 中返回未定义
- java - Java While 循环 - 输出不显示
- java - DataJpaTest 与单个自动装配测试 bean