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

StackOverflow https://stackoverflow.com//questions/11708597

Вопрос

Я создал подкласс 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, слишком).

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

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

РЕДАКТИРОВАТЬ1:Вдохновленный ответом Серджио, я придумал обходной путь:

// 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;
}
Это было полезно?

Решение

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

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

  }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top