从NIB大小问题加载UIView子类

时间:2010-07-28 10:40:49

标签: iphone uiview interface-builder nib

我有一个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. awakeFromNib中的super.frame.size.width = 0 self.frame.size.width也为0
  6. 当完成这个过程时,看起来视图下面几个像素位置,但我想我的代码会因为它可能是我做的事情而变得如此紧密。
  7. 任何帮助将不胜感激

1 个答案:

答案 0 :(得分:15)

如果您扩展 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]];
}