2010-07-28 62 views
12

我有一个UIView的子类,需要根据它的宽度计算它的高度。当在代码中创建一切正常。但是,当我尝试在“界面”构建器中创建视图时,尽管我重写了所有相关的方法,但我无法获取在界面构建器中设置的视图的大小。从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在框架的SETFRAME大小发送
  3. 正确的,我调用[超级SETFRAME:AFRAME]
  4. awakeFromNib称为
  5. super.frame.size.width =在awakeFromNib self.frame.size.width 0也0
  6. 当这个过程完成后,它看起来像是在它假设的下面几个像素,但我想我的代码得到如此紧凑的尺寸,它可能是我做的。

如果扩展initWithCoder,一定要调用父类方法的任何帮助将不胜感激

+0

的问题其实是完全错误的现在。我发布了一个由于某种原因被删除的答案。我的主要错误是使用%d在浮动时打印帧大小。这完全把我扔了。就我所见,我没有做的事情,你的回答实际上并没有做任何事情。 – 2014-04-01 16:47:36

回答

15

。正是在这个超级通话中,setFrame将在您的班级被调用。

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

我始终做到以下几点:

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

虽然这不是初始化控件两次吗? – Oren 2015-06-24 01:27:27