15

我有一个自定义 UIView 子类,它在初始化期间以编程方式添加子视图。我希望这个子视图与自定义 UIView 的宽度相同。

如果我以编程方式添加自定义 UIView,我的代码可以正常工作。但是,当 UIView 通过StoryBoard初始化时,我无法获得自定义 UIView 的宽度。

// Init programatically
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        NSLog (@"view: %f", self.frame.size.width);   //WILL return width
        NSLog (@"view: %f", self.bounds.size.width);  //WILL return width
    }
    return self;
}

// Init from storyboard
- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {

        NSLog (@"view: %f", self.frame.size.width);   //Returns 0
        NSLog (@"view: %f", self.bounds.size.width);  //Returns 0
    }
    return self;
}

当 initWithCoder: 由 StoryBoard 运行时,UIView 的框架和边界都返回为 0。有没有办法initWithCoder 中访问 UIView 的尺寸?或者,至少在调用 drawRect:之前访问尺寸?

谢谢。

4

2 回答 2

13

与其在 init 函数中设置子视图尺寸,不如在自定义视图的 layoutSubviews 方法中相对于自定义视图进行设置。在这里这样做意味着子视图的宽度也将始终更改以匹配自定义视图的宽度,即使您在初始化后的任何时候更改自定义视图的尺寸也是如此。

于 2013-03-02T09:21:29.387 回答
2

您可以重复使用您的标准initWithFrame呼叫。

- (id)initWithCoder:(NSCoder *)aDecoder 
{
    self = [super initWithCoder:aDecoder];
    if (self) {

        [self initWithFrame:[self frame]];

        NSLog (@"view: %f", self.frame.size.width);   
        NSLog (@"view: %f", self.bounds.size.width); 
    }
    return self;
}
于 2013-03-02T04:11:57.417 回答