initWithCoder возвращает 0 значений для свойства кадра

У меня есть подкласс 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.

Было бы здорово, если бы кто-нибудь объяснил мне, почему я получаю 0 значений в методе initWithCoder: при использовании раскадровки? и если использовать раскадровку, как этого добиться?

PS: я заметил, что метод layoutSubviews возвращает правильную информацию о кадре, но я не могу создавать здесь свои подпредставления, так как он вызывается при каждом изменении кадра (при прокрутке)


person niroshan    schedule 06.03.2013    source источник
comment
Посмотрите этот ответ: stackoverflow.com/questions/12758782/   -  person AndrewCr    schedule 09.04.2013
comment
Уловка, которая, кажется, работает: stackoverflow.com/a/5837133/294884   -  person Fattie    schedule 30.03.2014


Ответы (1)


Вы используете Autolayout в своей раскадровке?

Если вы действительно не пользуетесь им, вы можете отключить его, и ваш -initWithCoder: метод снова вернет ваш кадр.

Если вам действительно нужна автоматическая раскладка, попробуйте следующее:

-(void)awakeFromNib
{
    [super awakeFromNib];

    [self setNeedsLayout];
    [self layoutIfNeeded];

    // self.frame will now return something :)
}
person iOSCowboy    schedule 10.06.2013