2010-07-28 6 views
12

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

- (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. 
} 

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

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

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

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

+0

Вопрос на самом деле все не так сейчас. Я отправил сам ответ, который по какой-то причине был удален. Моя основная ошибка заключалась в использовании% d для печати размера кадра, когда это float. Это полностью отбросило меня. Насколько я понимаю, ваш ответ на самом деле ничего не делает. –

ответ

15

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

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

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

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

Разве это не инициализация контроля дважды? – Oren