Дилемма loadNibNamed и initWithFrame для установки высоты и ширины фрейма

Я создал подкласс UIView, связанный с файлом .xib. Этот подкласс UIView должен использоваться в UIViewController. В контроллере, я думаю, есть два варианта создания экземпляра подкласса UIView:

MyUIView *myView=[[MyUIView alloc] initWithFrame:aRect];

а также

MyUIView *myView = [[[NSBundle mainBundle] loadNibNamed:@"MyUIView" 
                                                  owner:self 
                                                options:nil] lastObject]; 

Я предпочитаю первый подход или его варианты, которые позволяют выполнять пользовательскую инициализацию. Единственная проблема в том, что мне нужно указать прямоугольник фрейма, который уже был указан в .xib (я имею в виду высоту и ширину фрейма MyUIView). Да, я могу снова жестко закодировать его в aRect, но это утомительно поддерживать (например, когда я меняю положение пользовательских интерфейсов в .xib, мне также нужно обновить aRect).

Таким образом, второй подход должен прийти на ум, поскольку прямоугольник кадра устанавливается автоматически. Оставшаяся проблема заключается в том, что я не могу настроить инициализатор (скажем, я хочу передать дополнительные параметры во время инициализации).

Каковы ваши предпочтения? Какой из них лучше на ваш взгляд?

EDIT1: Вдохновленный ответом Серджио, я придумал этот обходной путь:

// In MyViewController.m
MyUIView *myView=[[MyUIView alloc] initWithFrame:CGRectMake(x, y, 0.0, 0.0)];

// In MyView.m
- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        self = [[[NSBundle mainBundle] loadNibNamed:@"UnmovableTagView" 
                                              owner:self 
                                            options:nil] lastObject]; 
        [self setFrame:CGRectMake(frame.origin.x, 
                                  frame.origin.y, 
                                  [self frame].size.width, 
                                  [self frame].size.height)]; 
        // frame's width and height already determined after 
        // loadNibNamed was called
       ...
    }
    return self;
}

person Nimit Pattanasri    schedule 29.07.2012    source источник


Ответы (1)


Вы пробовали использовать:

MyUIView *myView=[[MyUIView alloc] initWithFrame:CGRectZero];

Я не знаю, работает ли это в вашем случае (загрузка представления из пера), но я успешно использую его, когда программно создаю свое собственное представление.

Вы можете попробовать.

РЕДАКТИРОВАТЬ:

вы можете определить свой собственный метод init для своего представления:

-(id)initWithPosition:(CGPoint)pos;

а затем позвоните:

-(id)initWithPosition:(CGPoint)pos {

  if (self = [super initWithFrame:{pos,{0,0}}]) {
    self = [[[NSBundle mainBundle] loadNibNamed:@"UnmovableTagView" 
                                          owner:self 
                                        options:nil] lastObject]; 
    [self setFrame:CGRectMake(frame.origin.x, 
                              frame.origin.y,  
                              [self frame].size.width,    
                              [self frame].size.height)]; 
     // frame's width and height already determined 
     // after loadNibNamed was called
   
  }
 
person sergio    schedule 29.07.2012
comment
В моем случае это не работает, потому что я тоже хочу передать origin.x и origin.y в aRect, но все равно спасибо. - person Nimit Pattanasri; 29.07.2012