5

Tengo un UIViewController simple con solo UIWebView. UIWebView debe tomar todo el espacio disponible para mostrar el contenido de una url.Redimensionar el tamaño de un UIViewController según su contenedor

Me gustaría volver a utilizar este ViewController en varios lugares. En algunos casos, se insertará en NavigationController, en algunos se mostrará como ModalViewController. A veces puede estar dentro de un TabBarController. El tamaño de UIWebView variará según el caso.

¿Cuál es la mejor manera de establecer el marco de UIWebView sin usar el Generador de interfaces? En otras palabras, ¿cómo debo inicializar webViewFrame en el siguiente código? ¿O hay algo más que me estoy perdiendo?

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    UIWebView* webView = [[UIWebView alloc] initWithFrame:webViewFrame]; 
    webView.delegate = self; 
    NSURLRequest* request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 
    [webView loadRequest:request]; 
    [self.view addSubview:webView]; 
    [webView release]; 
} 

He tratado con diferentes posibilidades (self.view.frame, self.navigationController.view.frame, etc.), pero nada parece funcionar para todos los casos.

Gracias!

Respuesta

8

Si no está utilizando un NIB, ¿cómo se ve el método -loadView? Debería verse así:

- (void)loadView 
{ 
    UIWebView* webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
    webView.delegate = self; 
    self.view = webView 
    [webView release]; 
} 

En este caso, el fotograma inicial es irrelevante. UIViewController se ocupará de dimensionar su vista correctamente.

Sin embargo, si realmente desea insertar una vista web (o cualquier otra vista) en una vista principal, use autoresizeMask para controlar cómo su vista cambia de tamaño con su elemento principal.

Por ejemplo:

UIView* parentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 200)]; 
    parentView.autoresizesSubviews = YES; 

    UIWebView* webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
    webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

    [parentView addSubview:webView]; 
    self.view = parentView; 
    [parentView release]; 

En este caso, el marco inicial de la web View es relativo a los límites del parentView.

+0

Gracias por la rápida respuesta, Darren. Ambas opciones resuelven la pregunta. Sin embargo, hay algo que no entiendo. ¿Por qué no puedo usar self.view.frame como webViewFrame en mi ejemplo de código? ¿No debería self.view.frame tener el tamaño correcto en viewDidLoad? – hpique

+1

self.view se redimensiona después de viewDidLoad. De hecho, puede redimensionarse en cualquier momento por varias razones (por ejemplo, la barra de título de la llamada en curso). Por lo tanto, siempre debe configurar su Masteringización de modo que sus sub-vistas se cambian de tamaño correctamente. – Darren

+0

Interesante. Entonces, ¿realmente no hay forma de conocer el marco real de selfview en viewDidLoad, entonces? – hpique

Cuestiones relacionadas