web-dev-qa-db-fra.com

Hauteur UIView dynamique avec disposition automatique dans iOS 6

Au cours des derniers jours, j'essaie de réaliser une mise en page assez simple (au moins elle devrait l'être) en utilisant des contraintes de mise en page automatique, mais sans succès.

Ma hiérarchie de vues est:
UIScrollView
- UIView (vue Conteneur)
----- UILabel (étiquette à plusieurs lignes)
----- UIWebView
----- UILabel
----- UIButton

View hierarchy in IB

La fonctionnalité souhaitée est la vue Conteneur à étendre en fonction de la taille du contenu. Afin d'augmenter la hauteur de l'UIWebView, j'utilise le code suivant:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [self.webView sizeToFit];
} 

J'ai essayé de nombreuses contraintes différentes, les plus raisonnables étant:
1. Épinglez l'espace supérieur de la vue d'ensemble pour le 1er label (titre de l'événement)
2. Espacement vertical des broches pour la 1ère étiquette et l'UIWebView
3. Espacement vertical des broches pour les autres éléments (c'est-à-dire UIWebView - UILabel (Event Date) et UILabel (Event Date) - UIButton)
4. La vue du conteneur a une contrainte d'espace vertical inférieur de faible priorité (1) avec sa vue d'ensemble

Le résultat que j'obtiens est le suivant: enter image description here

L'UIWebView se développe mais ne pousse pas le libellé de la date de l'événement et le bouton, et la vue Conteneur ne se développe pas non plus.

Toute aide serait grandement appréciée.

Vous pouvez télécharger l'exemple de projet Xcode d'ici.

30
Gerhat

Vous définissez la hauteur de contraint de votre vue Web sur 266. C'est pourquoi la hauteur de la vue Web est toujours fixe.

Vous pouvez créer cette contrainte de hauteur en tant qu'IBOutlet, par exemple:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *webViewHeightConstraint;

Vous pouvez ensuite modifier la constante de la contrainte de hauteur lorsque la vue Web a terminé de télécharger le contenu. La vue Web elle-même se compose d'une vue de défilement à l'intérieur, donc si vous voulez obtenir la hauteur globale du contenu:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    self.webViewHeightConstraint.constant = self.webView.scrollView.contentSize.height;
}

Ou apparemment, celui-ci fonctionne également:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [self.webView sizeToFit];
    self.webViewHeightConstraint.constant = self.webView.frame.size.height;
}
71
Valent Richie

Vous pourriez avoir besoin d'un délai avant de mettre à jour la taille du contenu de la vue Web. Et maçonnerie est utile pour l'utilisation de la mise en page automatique.

-(void)webViewDidFinishLoad:(UIWebView *)webview{
    [self performSelector:@selector(checkContentOnDelay:) withObject:webview afterDelay:0.001];
}

-(void)checkContentOnDelay:(UIWebView *)webview{
    CGSize contentSize = webview.scrollView.contentSize;
    if (contentSize.height > 2) {
        [webview updateConstraints:^(MASConstraintMaker *make) {
            make.height.equalTo(contentSize.height);
        }];
    }else{
        [self performSelector:@selector(checkContentOnDelay:) withObject:webview afterDelay:0.01];
    }
}
1
ymutlu