web-dev-qa-db-fra.com

UIScrollView fonctionne comme prévu, mais scrollRectToVisible: ne fait rien

J'ai déjà utilisé UIScrollView et je l'utilise maintenant et je n'ai jamais eu de problème. Je l'ajoute maintenant à une ancienne application et, bien que cela fonctionne comme prévu (je peux regarder le contenu, faire défiler du doigt, toutes les limites et toutes les tailles sont configurées correctement afin qu'il n'y ait pas d'espace vide dans le contenu, etc. .), Je ne peux tout simplement pas faire fonctionner scrollToRectVisible. J'ai même simplifié l'appel afin qu'il ne se déplace que vers la position 0,0:

 [scrollView scrollRectToVisible:CGRectMake(0, 0, 10, 10) animated:YES];

ou déplacez-le à 0,200:

 [scrollView scrollRectToVisible:CGRectMake(0, 200, 10, 10) animated:YES];

J'ai même créé une application rapide pour tester cela et je peux obtenir que scrollRectToVisible y travaille comme je le souhaite. Mais dans mon ancienne application, je n'arrive pas à lui faire faire quoi que ce soit.

Je peux faire défiler scrollView avec setContentOffset:, mais ce n'est pas ce que je veux.

Ce scrollView et son contenu sont définis dans la nib par IB et utilisés avec un IBOutlet. Le seul code que j'utilise dans mon application pour gérer le scrollView est 

 [scrollView setContentSize:CGSizeMake(scrollView.contentSize.width, imageView.frame.size.height)];

(Je ne m'intéresse qu'au défilement vertical et non horizontal).

Quelqu'un at-il rencontré un problème comme celui-ci?

J'ai comparé les attributs scrollView dans les deux applications et ils sont identiques.

ADDENDA:

Mon cadre scrollViews est: 0.000000 0.000000 480.000000 179.000000

Mon scrollViews contentTaille est: 0.000000 324.000000

Il agit toujours comme si le rect auquel je souhaitais faire défiler était déjà visible et qu'aucun défilement n'était nécessaire. Je ne sais pas si c'est ce qui se passe. Ceci est juste la chose la plus sacrée. Cela semble être une chose si facile à résoudre ...

ADDENDA N ° 2:

Voici comment je me débrouille sans scrollRectToVisible:

CGPoint point = myRect.Origin;
if (![clefScrollView pointInside:point withEvent:nil]) {
    point.x = 0;
    if (point.y > clefScrollView.contentSize.height - clefScrollView.bounds.size.height)
        point.y = clefScrollView.contentSize.height - clefScrollView.bounds.size.height;
    [clefScrollView setContentOffset:point animated: YES];
}

Tout le reste de cette scrollView fonctionne comme prévu, mais scrollRectToVisible. POURQUOI?!? Des suppositions sauvages?

60
mahboudz

Plus d'un mois plus tard, j'ai finalement compris. L’alternative ci-dessus a bien fonctionné, mais cela m’a énervé et j’ai dû enfin le comprendre. Il s'avère que c'était une erreur stupide.

Voici l'ancien code dans mon viewDidLoad, où j'ai configuré le scrollView:

[clefScrollView setContentSize:CGSizeMake(clefScrollView.contentSize.width, clefView.frame.size.height)];

La valeur d'une hauteur ou d'une largeur scrollView ne peut pas être 0! Je pense que cela m'a dépassé parce que je supposais que les tailles de ScrollView commençaient avec une taille valide et que le fait qu'une dimension était nulle était manquant!

Cela marche:

[clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)];

J'espère que cela aide quelqu'un là-bas. J'ai certainement passé beaucoup trop de temps à essayer de résoudre ce problème.

109
mahboudz

Oui, je n'ai pas eu de succès avec scrollRectToVisible:animated:, mais setContentOffset:animated: fonctionne toujours pour moi. Par curiosité, pourquoi ne voulez-vous pas utiliser setContentOffset:animated:? Cela semble être la bonne solution.

46

Vous voudrez peut-être vérifier et vérifier que la propriété delaysContentTouches du scrollView est définie sur NO

Si vous appelez la méthode scrollRectToVisible ou setContentOffset à partir d'un contact dans une sous-vue de votre scrollView, votre scrollView pourrait retarder les choses en retardant les contacts.

Donc, assurez-vous de définir les éléments suivants dans votre scrollView.

scrollView.delaysContentTouches = NO;

Vous pourrez probablement déplacer le scrollView avec et sans animation défini sur OUI.

5
Michael Colon

je l'avais comme ça et ça n'a pas marché

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width, someKnownValue);

je changeais simplement la hauteur de la contentSize, donc je ne pensais pas que cela me poserait le moindre problème, mais c'était le cas ...

dû changer pour cela

scrollView.contentSize = CGSizeMake(someOtherKnownValue, someKnownValue);

scrollView.contentSize.width n'est pas nécessairement défini dès le départ sur une valeur valide, il est donc préférable de lui attribuer une valeur spécifique.

1
Rugoso

Pour moi, le problème était qu'une contrainte dans une sous-vue n'était pas explicite . Vérifiez que chaque contrainte dans votre contenu est définie, même si vous n'en avez apparemment pas besoin pour la mise en page.

0
vauxhall

Un peu tard dans le match mais j'avais le même problème. Bien que la taille du contenu de ma vue de défilement ait été définie correctement, même de manière excessive pour la valeur de hauteur. Même après des contrôles approfondis pour valider les cadres et la taille du contenu, cela ne fonctionnait toujours pas. J'ai dû ajuster la hauteur du cadre, puis tout a bien fonctionné.

0
user1086279

J'ai eu les mêmes symptômes que ce problème .. le scrollRectToVisible ne fonctionnait pas comme prévu. Mon problème était que le scrollview sur le storyboard avait un problème de contrainte ambigu. Une fois que cela a été corrigé, l'appel a très bien fonctionné. C'est quelque chose d'autre à vérifier lorsque l'appel scrollRectToVisible ne fonctionne pas comme prévu.

0
Swifty

La solution suggérée ci-dessus peut toujours générer une erreur si vous n'avez pas défini le cadre pour "clefScrollView".

Si la solution ci-dessus est utilisée et présente toujours le même problème, assurez-vous d’avoir initialisé votre cadre scollView (dans ce cas, clefScrollView) avant de définir la vue du contenu.



    clefScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,320,450)];

    [clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)];



0
aimacworx