Как получить размеры пользовательского UIView, добавленного через раскадровку в initWithCoder:?

У меня есть пользовательский подкласс UIView, который добавляет subview программно во время инициализации. Я хочу, чтобы этот subview был такой же ширины, как пользовательский 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. Есть ли способ доступа к размерам UIView в initWithCoder? Или, по крайней мере, получить доступ к размерам до вызова drawRect:?

Спасибо.

Ответы

Ответ 1

Вместо того, чтобы устанавливать размеры subviews в функции init, установите его относительно пользовательского представления в методе layoutSubviews пользовательского представления. Выполнение этого здесь будет означать, что ширина подвью также всегда будет меняться в соответствии с шириной пользовательского представления, даже если вы измените размеры пользовательского представления в любой момент после инициализации.

Ответ 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;
}