web-dev-qa-db-fra.com

scrollView iOS a besoin de contrainte pour la position y ou la hauteur

-ViewController
--View
---ScrollView (Top,Bottom,Leading,Trailing spaces to superview set to 0)
----ContentView (Top,Bottom,Leading,Trailing spaces to superview set to 0, Width equals with View (ViewController's child))
-----Label1
-----etc...

Si je définis une contrainte de hauteur spécifique pour ma vue de contenu (par exemple 1000), le ScrollView fonctionne correctement, mais j’ai un ContentView statique de 1000, ce qui n’est pas mon objectif, car contentView a un contenu dynamique; Besoins.

Si je supprime la contrainte de hauteur pour mon ContentView, Xcode dit:

Missing Constraints:
ScrollView need constraints for: Y position or height

ScrollView est en fait épinglé en haut et en bas, donc je ne sais pas pourquoi Xcode veut une contrainte de hauteur pour ScrollView ...

Quelle est la bonne voie à suivre lorsque je souhaite que la hauteur ContentView soit la hauteur dont le contenu a besoin?

39
Bioaim

Chaque fois que vous utilisez ScrollView avec la mise en page automatique, suivez toujours les étapes ci-dessous,

  1. Contraintes ScrollView: LeadingSpace, topSpace, TrailingSpace, bottomSpace to superView et assurez-vous que lorsque vous contrôlez le glissement d'ajouter une contrainte, ajoutez-le en appuyant sur alt afin que la contrainte soit définie sans marge.

  2. Ajoutez UIView dans la vue de défilement en tant que vue de contenu et définissez ses contraintes: LeadingSpace, topSpace, trailingSpace, bottomSpace à ScrollView sans appuyer sur le bouton alt et définissez equalWidth sur ScrollView.

  3. Toutes les vues que vous ajoutez dans cette vue de contenu doivent avoir une contrainte de haut en bas, mais toutes les vues doivent avoir une contrainte verticale. Ainsi, contentView peut calculer la hauteur requise pour lui-même en fonction du contenu qu'elle contient.

Si les contraintes sont définies correctement, scrollView définit automatiquement la taille de son contenu en fonction du composant qu'il contient. Il n'est pas nécessaire de définir manuellement la taille du contenu. En outre, scrollView défile uniquement si le composant situé dans la vue du conteneur ne convient pas. sinon, il ne défilera pas. Si vous voulez quand même le faire défiler, vous devez vérifier la propriété Rebondir verticalement du storyboard pour obtenir l'effet de rebond.

Remarque: _ ​​Lorsque vous définissez une contrainte sur le composant situé dans scrollView, l'avertissement de contrainte s'affiche tant que vous ne définissez pas la contrainte du premier au dernier composant. Rappelez-vous toujours que votre composant supérieur doit avoir la contrainte supérieure ( Contrainte verticale) sur superView et le composant situé en bas doivent avoir une contrainte d’espace bas pour la super vue. Lorsque cette condition est satisfaite, tout avertissement disparaîtra par la suite.

Contraintes ScrollView: 

 enter image description here

Contraintes ContainerView: 

 enter image description here

119
Bharat Modi
  1. Sélectionnez votre contrôleur de vue
  2. Décocher 'Ajuster les incrustations d'affichage de défilement'

 enter image description here

3
alicanozkara

Ça va marcher

-ViewController
--View
---ScrollView (Top,Bottom,Leading,Trailing spaces to superview set to 0)
----ContentView (Top,Leading,Trailing spaces to ScorllView set to 0 | Height to dynamic (1000))
-----Label1
-----etc...

Faites de même pour votre ContentView, votre propre calcul pour votre contenu

- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:YES];
[self adjustHeightOfTableview];
}

- (void)adjustHeightOfTableview
{
CGFloat height = tblMainMenu.contentSize.height;
CGFloat maxHeight = tblMainMenu.superview.frame.size.height - tblMainMenu.frame.Origin.y;

// if the height of the content is greater than the maxHeight of
// total space on the screen, limit the height to the size of the
// superview.

if (height > maxHeight)
    height = maxHeight;

// now set the height constraint accordingly
self.tableViewHeightConstraint.constant = height;
[UIView animateWithDuration:0.1 animations:^{
    [self.view setNeedsUpdateConstraints];
}];
}

Modifier 1

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    NSString *OptName_length = @" Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam";
    NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:17.0]};
    CGRect rect = [OptName_length boundingRectWithSize:CGSizeMake(tableView.bounds.size.width-150.0, MAXFLOAT)
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:attributes
                                                  context:nil];

    CGSize requiredSize = rect.size;
    return requiredSize.height +5.0f;
    }

Edit 2

Consultez le site, cela vous aidera ... uitableviewcell-dynamic-height-with-autolayout-conclusion

1
Jaleel Nazir

Assurez-vous que la contrainte d'espace inférieur est définie sur 0 dans l'élément d'affichage situé dans la partie inférieure de votre vue de contenu, et assurez-vous que la hauteur de tous les éléments situés à l'intérieur de la vue contenu est définie.

Cela permet de redimensionner l'affichage du contenu en fonction des éléments qu'il contient. La hauteur de l'affichage défilement/affichage du contenu n'est pas fixe et votre affichage défilant sera redimensionné à la taille de l'écran du téléphone.

1
Babken Vardanyan

La réponse de Bharat Modi résout à peu près le problème, mais je (Xcode 8.3.2, iOS 10 SDK) devait également faire correspondre la hauteur et la largeur de la vue Contenu à la hauteur et à la largeur de UIScrollView.

Cela épingle la taille du contenu dans la zone visible, mais rend IB heureux. Ensuite, (je pense), il suffit de calculer correctement la taille du contenu et de le définir par programme. Ce que j'aurais eu à faire de toute façon, car si vous avez un contenu dynamique, vous ne pouvez le faire qu'au moment de l'exécution.

Si vous disposez d'une barre de navigation, vous pouvez également avoir besoin d'ajuster les paramètres "Ajuster les incrustations de vue de défilement" du contrôleur de vue.

Voici ce que j'ai

 UIScrollView in IB without warnings

Notez que cela pourrait être juste une particularité de ma configuration, car les suggestions officielles ( https://developer.Apple.com/library/content/ documentation/UserExperience/Conceptual/AutolayoutPG/WorkingwithScrollViews.html ) font également un don. t mentionner que cela doit être fait.

J'ai essayé de comprendre cela en utilisant simplement une vue de défilement, une vue du contenu et une autre vue factice de largeur et hauteur fixes pour imiter le contenu, mais rien ne semblait rendre IB heureux.

(Désolé, je n'ai pas assez de rep pour mettre cela comme un commentaire sur la réponse originale).


METTRE À JOUR:

Donc, ce que j’ai finalement fait, c’est de régler ma vue de contenu sur une hauteur fixe dans IB et de créer un point de vente pour cette contrainte de hauteur dans le code. Puis, une fois que la vue a chargé tout son contenu dynamique, je mets à jour la contrainte de hauteur comme suit:

self.uiContentViewHeightConstraint.constant = mapViewBottomY + 15

Et tout fonctionne. La clé ici est essentiellement que lorsqu'il y a une vue dans une vue de défilement, cette vue définit la taille du contenu de la vue de défilement. Comme cela a déjà été mentionné, la taille de la vue du contenu doit être entièrement définie au moment de la création pour que IB soit heureux. Vous êtes libre de manipuler les valeurs lors de l'exécution au travers de points de vente - c'est simple et sûr.

L'un des avantages de l'affichage du contenu à taille fixe dans IB est que, puisque vous avez défini la taille du contenu, vous pouvez désormais définir les affichages à l'intérieur de la vue du contenu, en utilisant des décalages relatifs.

0
denis.kim

Définissez la contrainte de marge en haut à droite et en bas de votre étiquette avec la vue de contenu de scrollview, et définissez le nombre de lignes de UILable sur 0. La vue de contenu sera agrandie en fonction de la taille de votre contenu.

 enter image description here

0
MuhammadTalhaSiddiqui

Un petit truc - si vous avez UIScrollView avec UITextView dans, vous vous plaignez:

"ScrollView a besoin de contrainte pour la position y ou la hauteur". Ou "Ambiguïté de la taille du contenu défilable UIScrollView"

Décochez simplement “Défilement activé” par défaut sur UITextView dans l'IB. Fonctionne comme par magie:)  enter image description here

0
Vitya Shurapov