web-dev-qa-db-fra.com

xcode/iOS: redimensionnement automatique pour remplir une vue - une taille de trame explicite est essentielle?

Je voudrais qu'une UITextView remplisse sa superView, qui est une simple UIView dans une instance UIViewController.

Il semble que je ne puisse pas faire le UITextView faire cela uniquement en utilisant les propriétés spécifiées par l'API de autoresizingMask et autoresizesSubviews. Le réglage de ceux-ci comme indiqué ici ne fait rien; la UITextView reste petite même si sa 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 textView remplit sa vue d'ensemble:

// 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 initialiseurs/méthodes, et la même situation se présente dans tous les cas:

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

Je me rends compte que la re-vérification de la 'vision' de la UIViewController est fugue, quelqu'un peut-il expliquer ce que je fais mal? J'ai supposé que je pouvais résoudre le problème en ayant un code de définition de trame initial dans ma UIViewController pour redimensionner la 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 défini ses valeurs '.size', donc encore une fois, textView reste petit.

Quelle est la bonne façon de réaliser ce que je veux? Dois-je spécifier explicitement les dimensions du plein écran via UITextView:initWithFrame pour qu’il remplisse son aperçu?

Je serais reconnaissant pour tout conseil que vous pouvez offrir.

36
KomodoDave

Le redimensionnement automatique ne signifie pas que la sous-vue prendra la taille de son aperçu. Cela signifie simplement qu'il sera redimensionné par rapport au changement de taille de son aperçu lorsque ses limites changent. Au début, vous devez donc définir la taille correcte de la sous-vue. Le masque de redimensionnement automatique traitera ensuite des changements de taille dans le futur.

C'est tout ce dont vous avez besoin:

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

Et ici Swift 3 solution:

myView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
0