UIScrollView avec iOS Auto Contraintes de Mise en forme: Problème de taille pour les sous-vues
Je suis en train de générer une vue dans le code. Voici la hiérarchie de mon point de vue de l'objet
- UIScrollView
- UIView
- UIButton
- UIView
La ScrollView doit être de la même taille que la fenêtre.
Le bouton doit être aussi grand que possible.
Je suis sous iOS mise en page automatique, de sorte que la contrainte de chaînes de caractères pour l'ensemble de mes objets ressembler à ceci
H:|[object]|
V:|[object]|
J'ai également défini translatesAutoresizingMaskIntoConstraints
à NO
pour chaque objet.
Le problème est que le bouton n'obtient que le bouton par défaut de la taille. Sa vue parent de l'objet (UIView) n'obtient que la taille de ses sous-vues besoin.
rouge: UIScrollView /jaune: UIView
Comment puis-je la force de ces points de vue à être aussi grand que la scrollView?
Lorsque j'utilise une UIView au lieu de th UIScrollView tout fonctionne très bien...
Voici un code:
- (void) viewDidLoad {
[super viewDidLoad];
//SCROLL VIEW
UIScrollView* scrollView = [UIScrollView new];
scrollView.backgroundColor=[UIColor redColor];
scrollView.translatesAutoresizingMaskIntoConstraints = NO;
//CONTAINER VIEW
UIView *containerView = [UIView new];
containerView.translatesAutoresizingMaskIntoConstraints = NO;
containerView.backgroundColor = [UIColor yellowColor];
[scrollView addSubview:containerView];
//CONSTRAINTS SCROLL VIEW - CONTAINER VIEW
[scrollView addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[containerView]|"
options:0 metrics:nil
views:@{@"containerView":containerView}]];
[scrollView addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[containerView]|"
options:0 metrics:nil
views:@{@"containerView":containerView}]];
//BUTTON
UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.translatesAutoresizingMaskIntoConstraints = NO;
[button setTitle:@"I'm way to small" forState:UIControlStateNormal];
[containerView addSubview:button];
//CONSTRAINTS CONTAINER VIEW - BUTTON
[containerView addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[button]|"
options:0 metrics:nil
views:@{@"button":button}]];
[containerView addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[button]|"
options:0 metrics:nil
views:@{@"button":button}]];
self.view = scrollView;
}
Mise à JOUR:
Je ne sais vraiment pas, pourquoi ce qui se passe. Si vous définissez le point de vue de l'IB, raccorder les prises, et instancier les afficher dans le code, la scrollview se comporte comme un mode normal (qui rebondit à la verticale). Son contentSize n'est pas calculée correctement. Plus ici. Mais comment le faire correctement?
Cessez de mettre votre grâce dans les postes les signatures n'ont pas leur place ici. Merci!
OriginalL'auteur Chrizzor | 2013-05-08
Vous devez vous connecter pour publier un commentaire.
Quelques observations:
Contraintes pour les sous-vues défiler les vues ne fonctionnent pas comme des contraintes dans les autres vues. Ils sont utilisés pour définir la
contentSize
de défilement de la vue. (Voir TN2154.) De cette façon, vous jetez un tas de trucs sur un parchemin, les contraintes pour les trucs à l'intérieur, et lacontentSize
est calculé pour vous. C'est caractéristique très cool, mais c'est l'antithèse de ce que vous essayez de faire ici.Pire, boutons, sauf si vous définissez une contrainte explicite de leur largeur et la hauteur du bouton, redimensionner en fonction de leur contenu.
L'effet net de ces deux observations est que vos contraintes existantes dire "(un) ensemble de mon conteneur de la taille de mon bouton; (b) que mon bouton redimensionner de façon dynamique à la taille du texte; et (c) de fixer mon scrollview de
contentSize
en fonction de la taille de mon bac (qui est la taille du bouton)."Je suis pas sûr que le problème de l'entreprise est. Mais voici tout de même quelques contraintes qui permettent d'atteindre ce que je pense que votre question était:
Franchement, je ne comprends pas le but commercial de votre INTERFACE utilisateur, comme cela se sent comme une contorsion de mise en page automatique pour réaliser très simplement de l'INTERFACE utilisateur. Je ne sais pas pourquoi vous avez un défilement de la vue si vous avez un "écran" de la taille du contenu dans (sauf si vous avez été parcourez les boutons). Je ne sais pas pourquoi vous auriez une vue de contenu avec un seul élément en elle. Je ne comprends pas pourquoi vous êtes à l'aide d'un bouton plein écran (je venais de mettre un robinet geste à la racine de la vue et de l'appeler un jour).
Je vais supposer que vous avez de bonnes raisons pour cela, mais il peut faire sens pour sauvegarder, demandez-vous quelle est votre expérience utilisateur voulue, puis approche le problème fraîche pour voir si il y a un moyen plus efficace pour obtenir l'effet désiré.
La hauteur de la taille du contenu a déjà été calculé correctement dans mon exemple, si le défilement vertical. J'étais à la recherche d'un contentSize comme ceci:
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width, ?)
. Pour ce faire, retirez toutes les contraintes verticales à partir de @Rob s exemple: le Défilement est toujours en marche et tous les sous-vues peut être aussi large que le défilement de l'affichage, sans leur donner explicitement la largeur.OriginalL'auteur Rob