【发布时间】:2016-10-10 23:42:22
【问题描述】:
我试图了解在子类化UIView 时如何正确使用NSCoder:
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
我想知道是否可以访问aDecoder 可能携带的任何属性。我会例如期望它知道视图在 Storyboards 中的frame 的大小。是否可以访问这些信息?我尝试了以下方法,但它只返回了 CGRect 的 0 值:
required init?(coder aDecoder: NSCoder) {
let frame = aDecoder.decodeCGRect(forKey: "frame")
print(frame) // prints: (0.0, 0.0, 0.0, 0.0)
super.init(coder: aDecoder)
}
我检查了UIView 的documentation,但没有这方面的信息。
【问题讨论】:
-
它可能会在第一个布局过程中发生变化。如果您使用约束,则框架不会在编码器中。为什么你需要知道?你想达到什么目的?可能有不同的方法。
-
刚刚在
super.init()之后尝试过,但它仍然只打印:(0.0, 0.0, 0.0, 0.0)。aDecoder不应该在情节提要中携带有关视图设置的基本信息吗?像frame或backgroundColor这样可以在UIView的初始化程序中使用? -
99% 的情况下,情节提要中对象的帧将由约束设置,而不是情节提要中指定的帧。
backgroundColor不同;这是一个通常会在情节提要中明确设置的属性,并且应该在调用super.init后可用。通常,您的子类将通过intrinsicContentSize指定它想要的大小