【问题标题】:Loading a UIView subclass from NIB size issues从 NIB 大小问题加载 UIView 子类
【发布时间】:2011-03-22 02:10:22
【问题描述】:

我有一个 UIView 的子类,它需要根据它的宽度来计算它的高度。在代码中创建时,一切正常。但是,当我尝试在界面生成器中创建视图时,虽然我覆盖了所有相关方法,但我无法获得界面生成器中设置的视图大小。

- (id)initWithCoder:(NSCoder *)aDecoder
{
    NSLog(@"init with coder before super width %d",super.frame.size.width); // returns 0
    self = [super initWithCoder:aDecoder];
    NSLog(@"init with coder after super width %d",super.frame.size.width); // still returns 0
}

- (void) awakeFromNib
{
      NSLog(@"width of view %d",super.frame.size.width); // Returns 0 as well
}

- (void) setFrame:(CGRect)aFrame
{
    [super setFrame:aFrame]; // Called from initWithCoder by super. Correct frame size. 
}  

所以我的下一个猜测是,我的视图的超级视图可能是在 awakeFromNib 之后设置我的视图框架。事实证明它没有。我在视图上覆盖了 setFrame,它在 initWithCoder 期间被调用。

这就是我目前所知道的:

  1. 第一个 initWithCoder 被调用
  2. 在 initWithCoder 期间,会发送对 setFrame:(CGRect)aFrame 的调用
  3. 在setFrame中框架的大小是正确的,我调用[super setFrame:aFrame]
  4. awakeFromNib 被调用
  5. super.frame.size.width = 0 in awakeFromNib self.frame.size.width 也是 0
  6. 完成该过程后,视图似乎比预期的位置低了几个像素,但我想我的代码与尺寸过于密集,这可能是我要做的事情。

任何帮助将不胜感激

【问题讨论】:

  • 这个问题现在其实全错了。我自己发布了一个答案,由于某种原因被删除。我的主要错误是在浮动时使用 %d 打印帧大小。那完全让我失望了。据我所知,您的回答实际上并没有做任何事情。

标签: iphone uiview interface-builder nib


【解决方案1】:

如果你扩展initWithCoder,一定要调用super方法。正是在这个超级调用期间,setFrame 将被调用到你的班级。

然后您可以重新使用您的标准 initWithFrame 呼叫。

我总是做以下事情:

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder]; // Required. setFrame will be called during this method.
    return [self initWithFrame:[self frame]];
}

【讨论】:

  • 这不是初始化控件两次吗?
猜你喜欢
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
相关资源
最近更新 更多