loadNibNamed vsinitWithFrame dilema para el establecimiento del marco de la altura y la anchura
-
13-12-2019 - |
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;
}
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
}