@IBDesignable UIView 不在故事板中调用 init
@IBDesignable UIView not calling init within storyboard
我有一个 UIView
即 @IBDesignable
@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 中将其 class 分配给 MyView
时,UIView
仍然有一个默认的背景颜色。为什么它的背景色在 Storyboard 中不是 UIColor.blue
?而且,请问我怎样才能做到这一点?
感谢您的帮助。
使用@IBDesignable 标签创建视图后。接下来是使用@IBInspectable 设置您的属性。
@IBDesignable
class MyView: UIView {
@IBInspectable var myBackgroundColour: UIColor? = nil {
willSet(v) {
self.backgroundColor = v
}
}
// YOUR EXISTING CODE HERE
}
现在,当您在 Identity Inspector 中将 MyView 设置为 class 名称时。您将能够在 Attributes Inspector 中看到可检查的 属性。在那里你可以设置颜色,它会立即反映到你的自定义视图中。
我看不出用你的自定义 属性 设置背景颜色有什么用,因为 UIView 有默认的 属性 来设置背景颜色。
希望对您有所帮助。
从情节提要中初始化此视图的初始化程序将在运行时调用,为了在编译时更新情节提要中的视图,您应该尝试包含 prepareForInterfaceBuilder
,它会在编译时更新情节提要 xib 文件。
我建议你在创建@IBDesignable 时做多件事 classes :
- 用
@IBDesignable
标签标记class
- 将
UIView
属性 标记为 @IBInspectable
,然后您将能够使用 StoryBoard 更改此 属性 的值]
- 设置那个属性的
willSet
中的配置代码是属性取值前的变化观察者,或者[=49=后的didSet
] 收到值。
- 在
prepareForInterfaceBuilder()
中进行额外的设置,它覆盖了其超级 class 类型的 UIView
简单易行!
您的代码应如下所示:
Swift 5 :
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 初始值为红色,您可以从 storyBoard 更改它;)
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()
}
}
}
- 创建上面的 BoxView.swift 文件。
- Select InterfaceBuilder 中的 UIView。
- 在
Identity Inspector
selectCustom Class -> Class to "BoxView"
。
- 在
Attributes Inspector
中设置 borderColor
、borderWidth
和 borderRadius
。
我有一个 UIView
即 @IBDesignable
@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 中将其 class 分配给 MyView
时,UIView
仍然有一个默认的背景颜色。为什么它的背景色在 Storyboard 中不是 UIColor.blue
?而且,请问我怎样才能做到这一点?
感谢您的帮助。
使用@IBDesignable 标签创建视图后。接下来是使用@IBInspectable 设置您的属性。
@IBDesignable
class MyView: UIView {
@IBInspectable var myBackgroundColour: UIColor? = nil {
willSet(v) {
self.backgroundColor = v
}
}
// YOUR EXISTING CODE HERE
}
现在,当您在 Identity Inspector 中将 MyView 设置为 class 名称时。您将能够在 Attributes Inspector 中看到可检查的 属性。在那里你可以设置颜色,它会立即反映到你的自定义视图中。
我看不出用你的自定义 属性 设置背景颜色有什么用,因为 UIView 有默认的 属性 来设置背景颜色。
希望对您有所帮助。
从情节提要中初始化此视图的初始化程序将在运行时调用,为了在编译时更新情节提要中的视图,您应该尝试包含 prepareForInterfaceBuilder
,它会在编译时更新情节提要 xib 文件。
我建议你在创建@IBDesignable 时做多件事 classes :
- 用
@IBDesignable
标签标记class - 将
UIView
属性 标记为@IBInspectable
,然后您将能够使用 StoryBoard 更改此 属性 的值] - 设置那个属性的
willSet
中的配置代码是属性取值前的变化观察者,或者[=49=后的didSet
] 收到值。 - 在
prepareForInterfaceBuilder()
中进行额外的设置,它覆盖了其超级 class 类型的UIView
简单易行!
您的代码应如下所示:
Swift 5 :
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 初始值为红色,您可以从 storyBoard 更改它;)
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()
}
}
}
- 创建上面的 BoxView.swift 文件。
- Select InterfaceBuilder 中的 UIView。
- 在
Identity Inspector
selectCustom Class -> Class to "BoxView"
。 - 在
Attributes Inspector
中设置borderColor
、borderWidth
和borderRadius
。