Pergunta

Criei uma subclasse UIView associada ao arquivo .xib.Esta subclasse UIView deve ser usada em um UIViewController.No controlador, acho que há duas opções de como instanciamos a subclasse UIView:

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

e

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

Prefiro a primeira abordagem ou suas variantes que me permitem realizar uma inicialização personalizada.O único problema é que preciso especificar o retângulo do quadro, que já foi especificado no .xib (Quero dizer a altura e largura do quadro MyUIView).Sim, posso codificá-lo novamente em aRect, mas isso é tedioso de manter (por exemplo, quando mudo a posição das UIs em .xib, tenho que atualizar aRect, também).

Portanto, a segunda abordagem deve vir em mente, pois o quadro reto é definido automaticamente.O problema restante é que não consigo personalizar o inicializador (digamos, quero passar parâmetros extras durante a inicialização).

Qual é a sua preferência?Qual é melhor na sua opinião?

EDITAR1:Inspirado pela resposta de Sergio, criei esta solução alternativa:

// 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;
}
Foi útil?

Solução

Você já tentou usar:

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

Não sei se funciona no seu caso (carregando a visualização de uma ponta), mas uso-o com sucesso quando crio minha visualização personalizada programaticamente.

Você pode tentar.

EDITAR:

você poderia definir o seu próprio init método para sua visualização:

-(id)initWithPosition:(CGPoint)pos;

e depois ligue:

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

  }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top