7 votes

Détecter le défilement dans une sous-classe de UIScrollView

Bonjour,

J'ai créé une sous-classe de UIScrollView et je souhaite maintenant savoir quand l'utilisateur fait défiler dans ma sous-classe. Pour cela, je l'ai implémenté de la manière suivante :

ImageScroller.h

@interface UIImageScroller : UIScrollView  {

ImageScroller.m (dans l'@implémentation)

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    NSLog(@"a fait défiler");
}

Le problème est que la méthode scrollViewDidScroll ne semble pas se déclencher. Y a-t-il une possibilité de le faire fonctionner ?

J'ai également essayé de définir le délégué sur lui-même, mais cela ne fonctionne pas.

 - (id)initWithCoder:(NSCoder *)aDecoder {
    if ((self = [super initWithCoder:aDecoder])) {
        self.directionalLockEnabled = YES;
        [self setDelegate:self];
    }
    return self;
}

J'ai ajouté un ScrollView à mon fichier XIB et j'ai défini sa classe sur mon ImageScroller. J'ai également défini le Fileowner et j'utilise UIScrollViewDelegate dans le fichier .h du ViewController ainsi que la mise en œuvre de la méthode scrollViewDidScroll dans le fichier .m.

Lorsque je définis le délégué de mon ImageScroller dans le code du fichier .m du XIB comme [imageScroller setDelegate:imageScroller] scrollViewDidScroll est déclenché dans ma sous-classe ImageScroller, mais celui dans mon ViewController n'est pas déclenché, alors que j'en ai besoin des deux.

Des solutions pour cela ?

Merci pour vos réponses à l'avance.

15voto

Jack Points 324

J'ai rencontré le même problème en créant une sous-classe de UIScrollView mais je l'ai résolu de cette façon. Comme mentionné ci-dessus, vous pouvez vous définir (instance de sous-classe) en tant que délégué cependant voici ce que j'ai fait.

Dans la sous-classe, j'ai remplacé les méthodes suivantes

//Remplacez ceci pour détecter lorsque l'utilisateur fait défiler, c'est également déclenché pendant la vue
// mise en page. Ici, vous pouvez vérifier votre taux de décélération et déterminer quand le défilement s'est
//arrêté.
-(void)setContentOffset:(CGPoint)contentOffset

//Remplacez ceci pour détecter lorsque la vue a été redimensionnée (juste un remplacement pratique)
-(void)setFrame:(CGRect)frame;

En ce qui concerne les autres méthodes UIScrollViewDelegate, le contrôleur de vue devrait être responsable de les gérer à mon avis.

4voto

Michał Kreft Points 538

Je pense que vous pouvez essayer de définir self.delegate = self; pour recevoir des événements.

4voto

Graham Points 136

Si quelqu'un recherche une réponse en Swift, c'est aussi simple que ça :

override var contentOffset: CGPoint {
    didSet {
        if contentOffset != oldValue {
            //same as scrollViewDidScroll
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X