Comment bien animer UIScrollView contentOffset

J'ai UIScrollView sous-classe. Son contenu est réutilisable, environ 4 ou 5 points de vue sont utilisés pour afficher des centaines d'éléments (pendant le défilement des objets cachés, de les réutiliser et de sauts à un autre poste lorsque son besoin de les voir)

Ce dont j'ai besoin: possibilité de faire défiler automatiquement mon défiler la vue de n'importe quelle position. Par exemple, mon scroll view affiche les 4e, 5e et 6e élément et quand j'appuie sur certaines cette touche pour faire défiler jusqu'à 30 de l'élément. En d'autres mots j'ai besoin de comportement standard de UIScrollView.

Cela fonctionne bien:

[self setContentOffset:CGPointMake(index*elementWidth, 0) animated:YES];

mais j'ai besoin de personnalisation. Par exemple, changer l'animation de la durée, ajouter un peu de code à exécuter à la fin de l'animation.

Évident décision:

[UIView animateWithDuration:3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
    [self setContentOffset:CGPointMake(index*elementWidth, 0)];
} completion:^(BOOL finished) {
    //some code
}];

mais j'ai quelques actions connecté à l'événement scroll, et maintenant ils sont tous en bloc d'animation et il entraîne tous les sous-vue de cadres pour animer trop (grâce à quelques éléments réutilisables tous les anime pas comme je veux)

La question est: Comment puis-je faire de l'animation personnalisée (en fait j'ai besoin d'une durée personnalisée, les actions sur la fin et BeginFromCurrentState option) pour le décalage du contenu SANS d'animation de tous le code, connecté à scrollViewDidScroll événement?

UPD:
Grâce à Andrew répondre(première partie) j'ai résolu le problème avec l'animation à l'intérieur de scrollViewDidScroll:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    [UIView performWithoutAnimation:^{
        [self refreshTiles];
    }];
}

Mais scrollViewDidScroll doit (pour ma part) s'exécute à chaque image de l'animation comme dans le cas de

[self setContentOffset:CGPointMake(index*elementWidth, 0) animated:YES];

Cependant, maintenant, il s'exécute qu'une seule fois au début de l'animation.

Comment puis-je résoudre ce problème?

OriginalL'auteur Lloyd18 | 2014-02-13