2010-03-21 7 views
0

J'essaie de faire glisser et déposer des UIViews dans un UIScrollView. Je voudrais que l'UIScrollView défile si je fais glisser un UIView de sorte qu'il croise le haut ou le bas du ScrollView. S'il touche le haut, il devrait défiler vers le haut. S'il touche le fond, il devrait défiler vers le bas. Une fois que le UIView est déplacé de sorte qu'il n'intersecte plus le haut ou le bas, le défilement devrait s'arrêter.Comment utiliser le glisser-déposer dans un UIScrollView

La première approche que j'ai essayée était de commencer un NSTimer chaque fois que j'ai détecté que l'UIView s'est croisé avec le haut ou le bas de la scrollview. Le minuteur ferait défiler le UIScrollView bit par bit jusqu'à ce qu'il soit invalidé. Cela a entraîné un défilement très saccadé, car il n'y a aucun moyen de prédire quand les minuteurs vont tirer.

Mon approche actuelle est de faire défiler tout simplement tout le chemin vers le haut ou le bas du ScrollView, comme ceci:

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:1.0]; 
[self.parentScrollview setContentOffset:newOffset animated:NO]; 
[UIView commitAnimations]; 

Pour arrêter le défilement, j'essaie de déterminer la position du toucher dans la touchesMoved: delegate, et l'utilise pour calculer le contentOffset à utiliser pour scrollView. Le problème est que lorsque j'essaie d'obtenir l'emplacement dans la vue via [[touche anyObject] locationInview: self], j'obtiens l'emplacement final, plutôt que l'emplacement actuel. Je suppose que c'est parce que le contentOffset sur le scrollView est défini immédiatement.

Existe-t-il un moyen d'obtenir l'emplacement réel d'un contact dans une situation comme celle-ci? Ou tout autre moyen de définir le contentOffset lorsque j'interromps l'animation de défilement?

Répondre

0

Cela peut être en retard, mais vous pouvez essayer d'interrompre l'ancienne animation avec une nouvelle animation, y compris cette déclaration:

[UIView setAnimationBeginsFromCurrentState:YES]; 

Vous pouvez faire la nouvelle animation très courte ou nulle durée, puis définissez un délégué et setAnimationDidStopSelector pour obtenir la valeur finale contentOffset.

Questions connexes