36 votes

xcode/iOS : Autoresize to fill a view - explicit frame size is essential ?

Je voudrais un UITextView pour remplir son superView qui est un simple UIView à l'intérieur d'un UIViewController instance.

Il semble que je ne puisse pas faire le UITextView le font uniquement en utilisant les propriétés spécifiées par l'API de l'interface utilisateur. autoresizingMask y autoresizesSubviews . Le réglage de ces paramètres, tel qu'illustré ici, n'a aucun effet. UITextView reste faible même si son superView remplit l'écran.

// use existing instantiated view inside view controller;
// ensure autosizing enabled
self.view.autoresizesSubviews = YES;
self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight|
                             UIViewAutoresizingFlexibleWidth;
// create textview
textView = [[[UITextView alloc] autorelease] initWithFrame:CGRectMake(0, 0, 1, 1)];
// enable textview autoresizing
[textView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|
                              UIViewAutoresizingFlexibleHeight];
// add textview to view
[self.view addSubview:textView];

Cependant, si j'instancie ma propre vue à l'intérieur du contrôleur de vue, en remplaçant sa propriété '.view', tout fonctionne comme prévu, et le textView remplit sa super-vue :

// reinstantiate view inside view controller
self.view = [[UIView alloc]init];
// create textview
textView = [[[UITextView alloc] autorelease] initWithFrame:CGRectMake(0, 0, 1, 1)];
// enable textview autoresizing
[textView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|
                              UIViewAutoresizingFlexibleHeight];
// add textview to view
[self.view addSubview:textView];

J'ai essayé les deux morceaux de code dans tous ces initialisateurs/méthodes, et la même situation se produit dans tous les cas :

-(id)init;
-(id)initWithFrame:(CGRect)frame;
-(void)viewDidLoad;

Je me rends compte que le fait de réinstaurer le ".view" de l'image de marque de l UIViewController est moche, quelqu'un peut-il m'expliquer ce que je fais mal ? J'ai supposé que je pourrais surmonter le problème en ayant un code initial de réglage de la trame dans mon fichier UIViewController pour redimensionner le UITextView une fois, et par la suite autoresizing fonctionnerait comme souhaité.

-(void)viewDidLoad {
    textView.frame = self.view.frame;
}

... mais apparemment le view.frame n'est pas configuré à ce stade, il n'a pas ses valeurs '.size' définies, donc une fois de plus le textView reste petit.

Quelle est la meilleure façon d'obtenir ce que je veux ? Dois-je spécifier explicitement les dimensions plein écran par l'intermédiaire de UITextView:initWithFrame pour qu'il remplisse sa vue supérieure ?

Je vous serais reconnaissant de tout conseil que vous pourriez me donner.

1 votes

Ne fais pas ça. autorelease avant que vous init . L'ordre correct est ` ... alloc] init] autorelease] . UIView` devrait convenir, mais NSString et d'autres clusters de classes fuiront si vous utilisez les autorelease y init dans le mauvais ordre. Désolé de ne pas être en mesure de répondre à votre vraie question, cependant.

1 votes

Merci Yuji, j'apprécie le conseil - quelque chose dont je n'étais pas conscient !

89voto

Ole Begemann Points 85798

Le redimensionnement automatique ne signifie pas que la vue secondaire prendra la taille de sa vue supérieure. Cela signifie simplement qu'elle sera redimensionnée en fonction de la modification de la taille de sa vue supérieure lorsque les limites de cette dernière changeront. Donc, au départ, vous devez définir la taille de la vue secondaire à la valeur correcte. Le masque de redimensionnement automatique se chargera ensuite des changements de taille à l'avenir.

C'est tout ce dont vous avez besoin :

textView = [[[UITextView alloc] autorelease] initWithFrame:self.view.bounds];
[textView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|
                              UIViewAutoresizingFlexibleHeight];

1 votes

J'ai mis cela dans loadView (en m'assurant d'appeler [super loadView] d'abord) et cela fait bien le travail :) Merci beaucoup, Ole

0 votes

Pour Swift, cela ressemble à ceci : var textView = UITextView(frame: self.view.bounds) textView.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight

1 votes

Pour Swift 2, prenez ceci : textView.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]

0voto

Et ici Swift 3 solution :

myView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X