loadNibNamed vs.dilema initWithFrame para definir a altura e largura do quadro
-
13-12-2019 - |
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;
}
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
}