web-dev-qa-db-fra.com

Rendre la vue redimensionnée à son parent lorsqu'elle est ajoutée avec addSubview

J'ai un problème lors de l'utilisation de addSubview.

Exemple de code:

ParentView *myParentView = [[ParentView alloc] initWithNibName:@"ParentView " bundle:nil];
ChildeView *myChildeView = [[ChildeView alloc] initWithNibName:@"ChildeView" bundle:nil];

//...  parent frame resized with setFrame lets say to x:0, y:0, W:320, H:411

[[myParentView view] addSubview: [myChildeView view]];

Mon enfant, une fois ajouté, est plus grand que le parent et ne redimensionne pas son cadre en fonction des limites du parent. Je ne peux pas utiliser "Clip Subviews" sur le parent, et "Autoresize Subviews" semble ne pas fonctionner si le cadre parent n'est pas redimensionné à nouveau. Existe-t-il une propriété qui permet à une sous-vue de redimensionner automatiquement en fonction des limites de son parent sans utiliser setFrame sur chaque enfant?

19
Luca

Si vous n’utilisez pas la disposition automatique, avez-vous essayé de définir le masque de redimensionnement automatique de la vue enfant? Essaye ça:

myChildeView.autoresizingMask = (UIViewAutoresizingFlexibleWidth |
                                 UIViewAutoresizingFlexibleHeight);

En outre, vous devrez peut-être appeler

myParentView.autoresizesSubviews = YES;

pour que la vue parent redimensionne automatiquement ses sous-vues lorsque son cadre change.

Si vous voyez toujours la vue enfant dessinée en dehors du cadre de la vue parent, il y a de fortes chances que la vue parent ne coupe pas son contenu. Pour résoudre ce problème, appelez

myParentView.clipsToBounds = YES;
31
Jeff Kelley

Copiez simplement le cadre de la vue parent dans la vue enfant puis ajoutez-le. Après que le redimensionnement automatique fonctionnera. En fait, vous ne devez copier que la taille CGRectMake (0, 0, parentView.frame.size.width, parentView.frame.size.height)

childView.frame = CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height);
[parentView addSubview:childView];
11
cat

Testé dans Xcode 9.4, Swift 4 Une autre façon de résoudre ce problème est, vous pouvez ajouter 

override func layoutSubviews() { self.frame = (self.superview?.bounds)! }

dans la classe sous-vue.

3
Zeesha

c'est tout ce dont vous avez besoin 

childView.frame = parentView.bounds
1
carmen_munich

Vous pouvez toujours le faire dans votre méthode UIViews - (void)didMoveToSuperview. Il sera appelé lors de l'ajout ou de la suppression de votre parent (nil lors de son retrait). À ce moment-là, définissez simplement votre taille sur celle de votre parent. À partir de ce moment, le masque de redimensionnement automatique devrait fonctionner correctement.

0
Sean