Existe-t-il un moyen d'ajuster UIScrollView
automatiquement la hauteur (ou la largeur) du contenu qu'il fait défiler?
Quelque chose comme:
[scrollView setContentSize:(CGSizeMake(320, content.height))];
Existe-t-il un moyen d'ajuster UIScrollView
automatiquement la hauteur (ou la largeur) du contenu qu'il fait défiler?
Quelque chose comme:
[scrollView setContentSize:(CGSizeMake(320, content.height))];
La meilleure méthode que j'ai jamais rencontrée pour mettre à jour la taille du contenu d'un en UIScrollView
fonction de ses sous-vues contenues:
Objectif c
CGRect contentRect = CGRectZero;
for (UIView *view in self.scrollView.subviews) {
contentRect = CGRectUnion(contentRect, view.frame);
}
self.scrollView.contentSize = contentRect.size;
Rapide
let contentRect: CGRect = scrollView.subviews.reduce(into: .zero) { rect, view in
rect = rect.union(view.frame)
}
scrollView.contentSize = contentRect.size
viewDidLayoutSubviews
J'exécutais ceci pour que la mise en page automatique se termine, dans iOS7 cela fonctionnait bien, mais tester os iOS6 la mise en page automatique pour une raison quelconque n'a pas terminé le travail, donc j'avais des valeurs de hauteur erronées, donc je suis passé àviewDidAppear
maintenant fonctionne bien. juste pour souligner que quelqu'un en aurait peut-être besoin. merciUIScrollView ne connaît pas automatiquement la hauteur de son contenu. Vous devez calculer vous-même la hauteur et la largeur
Faites-le avec quelque chose comme
Mais cela ne fonctionne que si les vues sont l'une en dessous de l'autre. Si vous avez une vue côte à côte, vous n'avez qu'à ajouter la hauteur d'une seule si vous ne voulez pas définir le contenu du défilement plus grand qu'il ne l'est réellement.
la source
int y = CGRectGetMaxY(((UIView*)[_scrollView.subviews lastObject]).frame); [_scrollView setContentSize:(CGSizeMake(CGRectGetWidth(_scrollView.frame), y))];
Solution si vous utilisez la mise en page automatique:
Mettre
translatesAutoresizingMaskIntoConstraints
àNO
tous les points de vue en cause.Positionnez et redimensionnez votre vue de défilement avec des contraintes externes à la vue de défilement.
Utilisez des contraintes pour disposer les sous-vues dans la vue de défilement, en vous assurant que les contraintes sont liées aux quatre bords de la vue de défilement et ne comptez pas sur la vue de défilement pour obtenir leur taille.
Source: https://developer.apple.com/library/ios/technotes/tn2154/_index.html
la source
J'ai ajouté ceci à la réponse d'Espuz et JCC. Il utilise la position y des sous-vues et n'inclut pas les barres de défilement. Modifier Utilise le bas de la sous-vue la plus basse visible.
la source
self.scrollView.showsHorizontalScrollIndicator = NO;
self.scrollView.showsVerticalScrollIndicator = NO;
au début etself.scrollView.showsHorizontalScrollIndicator = YES;
self.scrollView.showsVerticalScrollIndicator = YES;
à la fin de la méthode?Voici la réponse acceptée rapidement pour quiconque est trop paresseux pour le convertir :)
la source
Voici une adaptation Swift 3 de la réponse de @ leviatan:
EXTENSION
USAGE
Très simple d'utilisation!
la source
L'extension suivante serait utile dans Swift .
La logique est la même avec les réponses données. Cependant, il omet les vues cachées à l'intérieur
UIScrollView
et le calcul est effectué après que les indicateurs de défilement sont masqués.En outre, il existe un paramètre de fonction facultatif et vous pouvez ajouter une valeur de décalage en passant le paramètre à function.
la source
Excellente et meilleure solution de @leviathan. Il suffit de traduire rapidement en utilisant l'approche FP (programmation fonctionnelle).
la source
self.contentSize = self.subviews.reduce(CGRect(), { $0.union($1.frame) }).size
Vous pouvez obtenir la hauteur du contenu dans UIScrollView en calculant quel enfant "atteint plus loin". Pour calculer cela, vous devez prendre en compte l'origine Y (début) et la hauteur de l'élément.
En faisant les choses de cette façon, les éléments (sous-vues) n'ont pas à être empilés directement les uns sous les autres.
la source
J'ai trouvé une autre solution basée sur la solution de @ emenegro
Fondamentalement, nous déterminons quel élément est le plus bas dans la vue et ajoutons un rembourrage de 10 pixels en bas.
la source
Étant donné qu'un scrollView peut avoir d'autres scrollViews ou une arborescence de sous-vues inDepth différente, il est préférable d'exécuter en profondeur de manière récursive.
Swift 2
Usage
la source
Ou faites simplement:
(Cette solution a été ajoutée par moi en tant que commentaire sur cette page. Après avoir obtenu 19 votes pour ce commentaire, j'ai décidé d'ajouter cette solution comme réponse formelle au profit de la communauté!)
la source
Pour swift4 en utilisant réduire:
la source
La taille dépend du contenu chargé à l'intérieur de celui-ci et des options de détourage. S'il s'agit d'une vue de texte, cela dépend également de l'habillage, du nombre de lignes de texte, de la taille de la police, etc. Presque impossible pour vous de vous calculer. La bonne nouvelle est qu'il est calculé après le chargement de la vue et dans le viewWillAppear. Avant cela, tout est inconnu et la taille du contenu sera la même que la taille du cadre. Mais, dans la méthode viewWillAppear et après (comme viewDidAppear), la taille du contenu sera la taille réelle.
la source
Enveloppant le code de Richy, j'ai créé une classe UIScrollView personnalisée qui automatise complètement le redimensionnement du contenu!
SBScrollView.h
SBScrollView.m:
Comment l'utiliser:
importez simplement le fichier .h dans votre contrôleur de vue et déclarez une instance SBScrollView au lieu de l'instance UIScrollView normale.
la source
Définissez la taille du contenu dynamique comme ceci.
la source
cela dépend vraiment du contenu: content.frame.height peut vous donner ce que vous voulez? Cela dépend si le contenu est une seule chose ou un ensemble de choses.
la source
J'ai également trouvé que la réponse de Léviathan fonctionnait le mieux. Cependant, il calculait une hauteur étrange. Lorsque vous parcourez les sous-vues en boucle, si la vue de défilement est définie pour afficher des indicateurs de défilement, ceux-ci seront dans le tableau des sous-vues. Dans ce cas, la solution consiste à désactiver temporairement les indicateurs de défilement avant de boucler, puis à rétablir leur paramètre de visibilité précédent.
-(void)adjustContentSizeToFit
est une méthode publique sur une sous-classe personnalisée de UIScrollView.la source
Je pense que cela peut être un bon moyen de mettre à jour la taille de la vue du contenu d'UIScrollView.
la source
pourquoi pas une seule ligne de code ??
la source
la source