LoadNibnamed vs. Initwithframe Dilemma per impostare l'altezza e la larghezza del fotogramma
-
13-12-2019 - |
Domanda
Ho creato una sottoclasse UIView associata al file .xib. Questa sottoclasse UIView deve essere utilizzata in un UIViewController. Nel controller, penso che ci siano due opzioni come istanziare la sottoclasse UIView:
MyUIView *myView=[[MyUIView alloc] initWithFrame:aRect];
.
e
MyUIView *myView = [[[NSBundle mainBundle] loadNibNamed:@"MyUIView"
owner:self
options:nil] lastObject];
.
Preferisco il primo approccio o le sue varianti che mi consentono di eseguire l'inizializzazione personalizzata. L'unico problema è che devo specificare un frame rect, che era già stato specificato in.xib
(intendo l'altezza e la larghezza del fotogramma del MyUIView
). Sì, posso hardcoderlo di nuovo in aRect
, ma questo è noioso da mantenere (ad esempio, quando cambio la posizione di UIS in .xib, devo aggiornare aRect
, anche).
Quindi il secondo approccio dovrebbe entrare in mente mentre il telaio RT viene impostato automaticamente. Il problema rimanente non posso personalizzare l'inizializzatore (dire, voglio passare parametri aggiuntivi durante l'inizializzazione).
Qual è la tua preferenza? Quale è migliore secondo te?
Edit1: Ispirato dalla risposta di Sergio, sono uscito con questa soluzione 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;
}
. Soluzione
Hai provato ad usare:
MyUIView *myView=[[MyUIView alloc] initWithFrame:CGRectZero];
.
Non so se funziona nel tuo caso (caricando la vista da un pennino), ma lo uso correttamente quando creo la mia visualizzazione personalizzata.
Puoi provarlo.
Modifica:
È possibile definire il tuo metodo init
per la tua visualizzazione:
-(id)initWithPosition:(CGPoint)pos;
.
e quindi chiamare:
-(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
}
.