[英]@IBDesignable UIView not calling init within storyboard
我有一个@IBDesignable
的UIView
@IBDesignable
class MyView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
sharedInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
sharedInit()
}
private func sharedInit(){
translatesAutoresizingMaskIntoConstraints = false
backgroundColor = .blue
}
}
当我将这个UIView
放在 Storyboard 中,并将它的类分配给Identity inspector 中的MyView
时, UIView
仍然具有默认背景颜色。 为什么它的背景颜色不是故事板中的UIColor.blue
? 而且,我怎样才能做到这一点,拜托?
谢谢你的帮助。
从故事板初始化此视图的初始化程序将在运行时调用,为了在编译时更新故事板中的视图,您应该尝试包含在编译时更新故事板 xib 文件的prepareForInterfaceBuilder
。
我建议你在创建 @IBDesignable 类时做多件事:
@IBDesignable
标签标记类@IBInspectable
标记UIView
属性,然后您将能够使用StoryBoard更改此属性的值willSet
中设置配置代码,该属性在属性取值之前是变化的观察者,或在属性didSet
后didSet
。prepareForInterfaceBuilder()
进行额外的设置,它覆盖了它的超类UIView
简单易行!
您的代码应如下所示:
import UIKit
@IBDesignable
class myView: UIView {
@IBInspectable var storyBoardColor : UIColor = .red {
willSet(myVariableNameToCatch) {
self.backgroundColor = myVariableNameToCatch
}
}
fileprivate func sharedInit(){
translatesAutoresizingMaskIntoConstraints = false
backgroundColor = storyBoardColor
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
sharedInit()
}
}
myView 的 storyBoardColor 的初始值为 red,您可以从 storyBoard 更改它;)
使用标签@IBDesignable 创建视图后。 接下来是使用@IBInspectable 设置您的属性。
@IBDesignable
class MyView: UIView {
@IBInspectable var myBackgroundColour: UIColor? = nil {
willSet(v) {
self.backgroundColor = v
}
}
// YOUR EXISTING CODE HERE
}
现在,当您在Identity Inspector中将 MyView 设置为类名时。 您将能够在Attributes Inspector 中看到您的可检查属性。 您可以在那里设置颜色,它会立即反映到您的自定义视图中。
我认为使用自定义属性设置背景颜色没有任何用处,因为 UIView 具有设置背景颜色的默认属性。
希望能帮助到你。
Swift 4.2 测试和工作。 这是最干净的解决方案。
在 Xcode 中确保选中Editor -> Automatically refresh views
。
import UIKit
@IBDesignable
class BoxView: UIView {
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
layer.borderColor = borderColor?.cgColor
layer.borderWidth = borderWidth
layer.cornerRadius = cornerRadius
}
@IBInspectable var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.cgColor
setNeedsLayout()
}
}
@IBInspectable var borderWidth: CGFloat = 0.0 {
didSet {
layer.borderWidth = borderWidth
setNeedsLayout()
}
}
@IBInspectable var cornerRadius: CGFloat = 0.0 {
didSet {
layer.cornerRadius = cornerRadius
setNeedsLayout()
}
}
}
Identity Inspector
选择Custom Class -> Class to "BoxView"
。Attributes Inspector
设置borderColor
、 borderWidth
和borderRadius
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.