2013-08-20 5 views
9

Obiettivo:corrispondenza di visualizzazione secondaria alla sua superview usando autolayout

Avere un UIWebView essere la stessa larghezza come è superview, che è un UIScrollView, utilizzando autolayout vincoli.

Codice

NSLayoutConstraint *makeWidthTheSameAsScrollView =[NSLayoutConstraint 
                 constraintWithItem:self.questionWebView 
                 attribute:NSLayoutAttributeWidth 
                 relatedBy:0 
                 toItem:self.masterScrollView 
                 attribute:NSLayoutAttributeWidth 
                 multiplier:1.0 
                 constant:0]; 

[self.view addConstraint:makeWidthTheSameAsScrollView]; 

NSLog(@"The width of questionWebView *AFTER* adding the constrain is: %f", self.questionWebView.frame.size.width); 
NSLog(@"The width of scrollView *AFTER* adding the constrain is: %f", self.masterScrollView.frame.size.width); 

risultato corrente

Quando annoto la larghezza della self.questionWebView (la UIWebView), è la larghezza non cambia quando viene applicato il vincolo layout automatico.

Domande

  • È questo l'approccio corretto?
  • Cosa sto sbagliando?

P.S so che è contro le raccomandazioni di Apple per effettuare una UIWebView in un UIScrollView, però ho spento la possibilità di scorrere la UIWebView utilizzando la proprietà self.questionWebView.userInteractionEnabled = NO;. E attualmente l'utilizzo di UIWebView è la mia migliore strategia per la visualizzazione di una tabella HTML.

risposta

16

Migliorare la risposta di Rob, come richiesto.

Come già detto, UIScrollViews ha un comportamento particolare in Layout automatico.

Ciò che è interessante in questo caso è il fatto che la larghezza totale della scrollView viene determinata utilizzando la larghezza totale delle sue sottoview. Quindi mentre lo scrollView richiede già la larghezza del webView, stai dicendo a webView di chiedere anche scrollView per la sua larghezza. Ecco perché non funziona. Uno sta chiedendo un altro e nessuno conosce la risposta. È necessaria un'altra vista di riferimento da utilizzare come vincolo per la visualizzazione Web e quindi scrollView sarà anche in grado di chiedere con successo la larghezza prevista.

Un modo semplice per eseguire questa operazione: creare un'altra vista, containerView, e aggiungere la scrollView come sottoscheda. Quindi imposta i vincoli appropriati per containerView. Diciamo che volevi la scrollView centrata su un viewController, con qualche padding sui bordi.Così farlo per il containerView:

NSDictionary *dict = NSDictionaryOfVariableBindings(containerView); 
[self.view addConstraints:[NSLayoutConstraints constraintsWithVisualFormat:@"H|-(100)-[containerView]-(100)-|" options:0 metrics:0 views:dict]; 
[self.view addConstraints:[NSLayoutConstraints constraintsWithVisualFormat:@"V|-(100)-[containerView]-(100)-|" options:0 metrics:0 views:dict]; 

quindi si può procedere aggiungendo il WebView come una visualizzazione secondaria alla ScrollView e impostando la sua larghezza:

NSLayoutConstraint *makeWidthTheSameAsScrollView =[NSLayoutConstraint 
                 constraintWithItem:self.questionWebView 
                 attribute:NSLayoutAttributeWidth 
                 relatedBy:0 
                 toItem:containerView 
                 attribute:NSLayoutAttributeWidth 
                 multiplier:1.0 
                 constant:0]; 

[self.view addConstraint:makeWidthTheSameAsScrollView]; 

Ciò renderebbe lo ScrollView più grande e alto come il webView, ed entrambi sarebbero posizionati come previsto (con i vincoli impostati su containerView).

+1

Puoi farlo anche in IB: https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutbyExample/AutoLayoutbyExample.html#//apple_ref/doc/uid/TP40010853-CH5-SW5 "Creazione di viste ancorate all'interno di una vista di scorrimento" – Brenden

3

Le schermate di scorrimento sono un po 'strane nel modo in cui interagiscono con il layout automatico. Vedere TN2154 (UIScrollView e Autolayout).

Vedere anche UIScrollView doesn't use autolayout constraints.

In generale, è necessario ottenere la larghezza della vista contenuta in un modo diverso da "la larghezza corrente della scrollview" poiché nel layout automatico la larghezza della vista a scorrimento (cioè la larghezza del contenuto) è definita in termini del suo contenuto. Quindi la tua richiesta attuale è circolare.

+2

Una strategia facile sarebbe quella di aggiungere la scrollView come sottoview ad un'altra vista (strutturata proprio come lo scrollView) e impostare Auto Layout per utilizzare la larghezza di questa vista per impostare la vista web. –

+1

@AlohaSilver grazie, aggiungilo come risposta separata per favore, penso che sia utile scomposto come risposta piuttosto che come commento. – drc