我有一个自定义的UIView子类,它在初始化过程中以编程方式添加子视图。我希望这个子视图与自定义UIView的宽度相同。
如果我以编程方式添加自定义UIView,我的代码正常。但是,当通过 StoryBoard 初始化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;
}
当initBithCoder:由StoryBoard运行时,UIView的框架和边界都返回为0。 有没有办法在 initWithCoder中访问UIView的维度?或者,至少在调用 drawRect:之前访问维度?
感谢。
答案 0 :(得分:13)
不是在init函数中设置子视图尺寸,而是在自定义视图的layoutSubviews方法中相对于自定义视图进行设置。在此处执行将意味着即使您在初始化后的任何时候更改自定义视图的尺寸,子视图的宽度也将始终更改以匹配自定义视图的宽度。
答案 1 :(得分: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;
}