5

Ho un semplice UIViewController con solo un UIWebView. UIWebView dovrebbe occupare tutto lo spazio disponibile per mostrare il contenuto di un url.Ridimensiona programmaticamente un UIViewController basato sul suo contenitore

Vorrei riutilizzare questo ViewController in vari punti. In alcuni casi verrà inserito in un NavigationController, in alcuni verrà visualizzato come ModalViewController. A volte potrebbe essere all'interno di un TabBarController. Le dimensioni di UIWebView variano da caso a caso.

Qual è il modo migliore per impostare il frame di UIWebView senza utilizzare Interface Builder? In altre parole, come dovrei inizializzare webViewFrame nel seguente codice? O c'è qualcos'altro che mi manca?

- (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]; 
} 

ho provato con diverse possibilità (self.view.frame, self.navigationController.view.frame, etc.), ma nulla sembra funzionare per tutti i casi.

Grazie!

risposta

8

Se non si utilizza una NIB, quale sarà il metodo -loadView? Dovrebbe apparire così:

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

In questo caso, il frame iniziale è irrilevante. UIViewController si occuperà di dimensionare correttamente la vista.

Tuttavia, se si desidera effettivamente inserire una vista Web (o qualsiasi altra vista) in una vista padre, si utilizza la maschera di autoresize per controllare il modo in cui la vista viene ridimensionata con quella principale.

Ad esempio:

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

In questo caso, fotogramma iniziale della WebView è relativo al limite del parentView.

+0

Grazie per la rapida risposta, Darren. Entrambe le opzioni risolvono la domanda. Tuttavia, c'è qualcosa che non capisco. Perché non posso usare self.view.frame come webViewFrame nel mio esempio di codice? Se self.view.frame non ha la dimensione giusta in viewDidLoad? – hpique

+1

self.view viene ridimensionato dopo viewDidLoad. In effetti, può essere ridimensionato in qualsiasi momento per una serie di motivi (ad esempio, la barra del titolo call-in-progress). Pertanto, è necessario impostare sempre la maschera di autorizzazione in modo che le viste secondarie vengano ridimensionate correttamente. – Darren

+0

Interessante. Quindi non c'è in realtà alcun modo per conoscere l'effettiva cornice di self.view in viewDidLoad, quindi? – hpique

Problemi correlati