Pregunta

He creado un UIView subclase asociados .xib archivo.Este UIView subclase es para ser utilizado en un UIViewController.En el controlador, creo que hay dos opciones de cómo instanciamos el UIView subclase:

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

y

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

Yo prefiero el primer método o sus variantes, que me permitirá llevar a cabo personalizado de inicialización.El único problema es que tengo que especificar un marco rect, que ya estaba especificado en .xib (Me refiero a la trama de la altura y la anchura de MyUIView).Sí, puedo codificarlo de nuevo en aRect, pero esto es tedioso para mantener (por ejemplo, cuando me cambio de posición de la UIs en .xib, tengo que actualizar aRect, también).

Así que el segundo enfoque debe vienen a la mente como el marco rect se establece automáticamente.El problema es que no puedo personalizar el inicializador (digamos, quiero pasar parámetros adicionales durante la inicialización).

¿Cuál es tu preferencia?Cual es mejor en su opinión?

EDIT1:Inspirado por sergio de la respuesta, me salió con esta solución:

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

Solución

Has probado a utilizar:

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

No sé si funciona en tu caso (la carga de la vista de una mina), pero yo lo uso con éxito cuando puedo crear mi vista personalizada mediante programación.

Usted puede darle una oportunidad.

EDITAR:

usted puede definir su propio init método para la vista:

-(id)initWithPosition:(CGPoint)pos;

y, a continuación, llame al:

-(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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top