Загрузка подкласса UIView из проблем размера NIB - PullRequest
12 голосов
/ 28 июля 2010

У меня есть подкласс UIView, который должен рассчитать его высоту в соответствии с его шириной. При создании в коде все работает. Однако, когда я пытаюсь создать представление в Интерфейсном Разработчике, и хотя я переопределяю все связанные методы, я не могу получить размер представления, установленного в Интерфейсном Разработчике.

- (id)initWithCoder:(NSCoder *)aDecoder
{
    NSLog(@"init with coder before super width %d",super.frame.size.width); // returns 0
    self = [super initWithCoder:aDecoder];
    NSLog(@"init with coder after super width %d",super.frame.size.width); // still returns 0
}

- (void) awakeFromNib
{
      NSLog(@"width of view %d",super.frame.size.width); // Returns 0 as well
}

- (void) setFrame:(CGRect)aFrame
{
    [super setFrame:aFrame]; // Called from initWithCoder by super. Correct frame size. 
}  

Таким образом, мое следующее предположение было, может быть, супервидение моего представления устанавливает кадр моего представления после awakeFromNib. Ну, оказывается, это не так. Я переопределил setFrame в моем представлении, и он вызывается во время initWithCoder.

Так вот, что я знаю до сих пор:

  1. Первый initWithCoder называется
  2. Во время initWithCoder отправляется вызов setFrame: (CGRect) aFrame
  3. в setFrame размер кадра правильный, и я вызываю [super setFrame: aFrame]
  4. awakeFromNib называется
  5. super.frame.size.width = 0 в awakeFromNib self.frame.size.width также 0
  6. Когда процесс завершен, кажется, что представление на несколько пикселей ниже того места, где оно должно быть, но я предполагаю, что мой код настолько сосредоточен на измерениях, что это может быть чем-то, что я делаю.

Любая помощь будет оценена

1 Ответ

15 голосов
/ 30 апреля 2011

Если вы расширяете initWithCoder, обязательно вызовите метод super. Именно во время этого супер-звонка setFrame будет вызван в вашем классе.

Затем вы можете повторно использовать свой стандартный initWithFrame вызов.

Я всегда делаю следующее:

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder]; // Required. setFrame will be called during this method.
    return [self initWithFrame:[self frame]];
}
...