【问题标题】:Is it possible to access a UIView's properties (e.g. frame) in init(coder:)?是否可以在 init(coder:) 中访问 UIView 的属性(例如框架)?
【发布时间】: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)
}

我检查了UIViewdocumentation,但没有这方面的信息。

【问题讨论】:

  • 它可能会在第一个布局过程中发生变化。如果您使用约束,则框架不会在编码器中。为什么你需要知道?你想达到什么目的?可能有不同的方法。
  • 刚刚在super.init() 之后尝试过,但它仍然只打印:(0.0, 0.0, 0.0, 0.0)aDecoder 不应该在情节提要中携带有关视图设置的基本信息吗?像framebackgroundColor 这样可以在UIView 的初始化程序中使用?
  • 99% 的情况下,情节提要中对象的帧将由约束设置,而不是情节提要中指定的帧。 backgroundColor 不同;这是一个通常会在情节提要中明确设置的属性,并且应该在调用 super.init 后可用。通常,您的子类将通过intrinsicContentSize 指定它想要的大小

标签: ios swift uiview nscoder


【解决方案1】:

如果您需要自定义视图的实际尺寸,那么您应该查看视图的视图控制器方法:

-(void) viewDidLayoutSubviews

当它被调用时,您的自定义视图应该设置正确的尺寸。

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2011-03-27
    • 2014-12-07
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多