3

我对 uiscrollview 进行了分类,并使用 initWithCoder 为我的 uiscrollview 准备了所有子视图。我使用下面的代码来设置它:

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

    NSLog(@"%f", self.frame.size.height);

    self.contentSize = CGSizeMake(5000, self.frame.size.height);

    labelContainerView = [[UIView alloc] init];
    labelContainerView.frame = CGRectMake(0, 0, self.contentSize.width, self.contentSize.height/2);
    labelContainerView.backgroundColor = [UIColor yellowColor];
    [self addSubview:labelContainerView];
}

但这一直失败,因为 self.frame 属性总是返回 0 值。使用self.frame属性对我来说非常重要,因为我想使用情节提要对滚动视图的框架进行任何高度调整。

我使用 xib 文件而不是使用情节提要尝试了同样的事情,它工作正常。但在我的项目中,我不想使用 xib 文件。

如果有人能解释我为什么在使用情节提要时在 initWithCoder: 方法中得到 0 值,那就太好了?如果使用情节提要如何实现这一目标?

PS:我注意到layoutSubviews方法返回正确的帧信息,但我无法在这里创建我的子视图,因为每次帧更改都会调用它(当我滚动时)

4

1 回答 1

3

您是否在情节提要中使用自动布局?

如果您真的没有利用它,您可以禁用它,您的 -initWithCoder: 方法将再次返回您的框架。

如果您确实需要 Autolayout,请尝试以下操作:

-(void)awakeFromNib
{
    [super awakeFromNib];

    [self setNeedsLayout];
    [self layoutIfNeeded];

    // self.frame will now return something :)
}
于 2013-06-10T19:21:42.810 回答