loadNibNamed vs.initWithFrame dilemme pour définir la hauteur et la largeur du cadre
-
13-12-2019 - |
Question
J'ai créé une sous-classe UIView associée au fichier .xib.Cette sous-classe UIView doit être utilisée dans un UIViewController.Dans le contrôleur, je pense qu'il existe deux options pour instancier la sous-classe UIView :
MyUIView *myView=[[MyUIView alloc] initWithFrame:aRect];
et
MyUIView *myView = [[[NSBundle mainBundle] loadNibNamed:@"MyUIView"
owner:self
options:nil] lastObject];
Je préfère la première approche ou ses variantes qui me permettent d'effectuer une initialisation personnalisée.Le seul problème est que je dois spécifier le rect d'un cadre, qui a déjà été spécifié dans .xib
(Je veux dire la hauteur et la largeur du cadre de MyUIView
).Oui, je peux le coder à nouveau en dur dans aRect
, mais c'est fastidieux à maintenir (par exemple, lorsque je change la position des interfaces utilisateur dans .xib, je dois mettre à jour aRect
, aussi).
La deuxième approche devrait donc venir à l’esprit car le frame rect est automatiquement défini.Le problème restant est que je ne peux pas personnaliser l'initialiseur (par exemple, je souhaite transmettre des paramètres supplémentaires lors de l'initialisation).
Quelle est votre préférence ?Lequel est le meilleur selon vous ?
EDIT1 :Inspiré par la réponse de Sergio, j'ai proposé cette solution de contournement :
// 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;
}
La solution
Avez-vous essayé d'utiliser :
MyUIView *myView=[[MyUIView alloc] initWithFrame:CGRectZero];
Je ne sais pas si cela fonctionne dans votre cas (chargement de la vue depuis une plume), mais je l'utilise avec succès lorsque je crée ma vue personnalisée par programme.
Vous pouvez essayer.
MODIFIER:
tu pourrais définir le tien init
méthode pour votre point de vue :
-(id)initWithPosition:(CGPoint)pos;
puis appelle :
-(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
}