2011-02-07 11 views
36

Me gustaría que UITextView llene su superView, que es UIView en una instancia UIViewController.xcode/iOS: Autoresize para completar una vista: ¿el tamaño de fotograma explícito es esencial?

Parece que no puedo hacer que el UITextView haga esto únicamente mediante el uso de las propiedades especificadas por API de autoresizingMask y autoresizesSubviews. Establecer esto como se muestra aquí no hace nada; el UITextView permanece pequeño aunque su superView llena la pantalla.

// 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]; 

Sin embargo, si crear instancias de mi propio punto de vista en el interior del controlador de vista, en sustitución de su propiedad '.Ver', entonces todo funciona como se esperaba, y la Textview llena su supervista:

// 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]; 

I' he intentado dos trozos de código dentro de todos estos inicializadores/métodos, y surge la misma situación en todos los casos:

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

Soy consciente de que reinstantiating el '.Ver' de la UIViewController es fugly, ¿alguien puede explicar lo que estoy haciendo mal? Supuse que podría solucionar el problema teniendo el código inicial de configuración de fotogramas en mi UIViewController para cambiar el tamaño del UITextView una vez y, a partir de entonces, autoresizing funcionaría según lo deseado.

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

... pero al parecer la view.frame no está configurado en esta etapa, que no tiene sus valores '' .size definen, por lo que una vez más Textview sigue siendo pequeño.

¿Cuál es la forma correcta de lograr lo que quiero? ¿Debo especificar explícitamente las dimensiones de pantalla completa a través del UITextView:initWithFrame para que ocupe su supervista?

Estaría agradecido por cualquier consejo que pueda ofrecer.

+1

¿No '' autorelease' antes init'. El orden correcto es '... alloc] init] autorelease]'. 'UIView' debería estar bien, pero' NSString's y otros clústeres de clase se perderán si usa 'autorelease' y' init' en el orden incorrecto. Lo siento por no poder ayudar a tu verdadera pregunta, sin embargo. – Yuji

+1

Gracias Yuji, agradezco la sugerencia, ¡algo de lo que no estaba enterado! – KomodoDave

Respuesta

88

Autoreizar no significa que la subvista tomará el tamaño de su supervista. Simplemente significa que cambiará el tamaño en relación con el cambio de tamaño de su supervista cada vez que cambien los límites de la supervista. Entonces, inicialmente, debe establecer el tamaño de la subvista al valor correcto. La máscara de aumento automático se ocupará de los cambios de tamaño en el futuro.

Esto es todo lo que necesita:

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

Pongo esto en loadView (asegurándome de llamar a [super loadView] primero) y hace el trabajo muy bien :) Muchas gracias, Ole – KomodoDave

+0

@KomodoDave gracias. realmente buena información: D –

+0

Para Swift se ve así: 'var textView = UITextView (frame: self.view.bounds) textView.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight' – martinmose

0

Y aquí Swift 3 solución:

myView.autoresizingMask = [.flexibleWidth, .flexibleHeight] 
Cuestiones relacionadas