Objective c 如何获取通过initWithCoder:中的故事板添加的自定义UIView的维度?

Objective c 如何获取通过initWithCoder:中的故事板添加的自定义UIView的维度?,objective-c,uiview,uistoryboard,Objective C,Uiview,Uistoryboard,我有一个自定义UIView子类,它在初始化过程中以编程方式添加子视图。我希望此子视图与自定义UIView的宽度相同 如果我以编程方式添加自定义UIView,我的代码运行良好。但是,当通过情节提要初始化UIView时,我无法获得自定义UIView的宽度 // Init programatically - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) {

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

如果我以编程方式添加自定义UIView,我的代码运行良好。但是,当通过情节提要初始化UIView时,我无法获得自定义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:时,UIView的帧和边界都返回为0。 在initWithCoder中是否有访问UIView维度的方法??或者,至少在调用drawRect:之前访问维度


谢谢。

您可以重复使用标准的
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;
}

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

这在UIViewController中是可以的,但在自定义UIView子类中则不行。”“self”已经是“view”-即UIView中没有“self”的“view”属性。使用您编辑的代码,我得到一个编译器错误
委托初始化调用的结果必须立即返回或分配给“self”
。返回[self initWithFrame:[self frame]];或self=[self initWithFrame:[self frame]];使用
self=[self initWithFrame:[self frame]]导致编译器抱怨破坏自动布局约束(“将尝试通过破坏约束进行恢复”),并导致不需要的布局。我认为IB没有在“init”阶段设置帧尺寸,这是我问题的核心。一旦我在initWithCoder:中使用“return”,函数就结束了。Aaaah。非常感谢。在测试中,你确实是对的。layoutSubviews:具有可用的尺寸,并在drawRect:之前调用!这正是我想要的。要补充一点说明,如果您使用的是Autolayout(我认为您是),则视图控制器的视图及其子视图的边界在布局完成后才可用-
viewdilayoutsubviews
在发生这种情况后在视图控制器上调用。感谢您的帮助:)