Question

J'ai une sous-classe de UIScrollView qui remplace

toucheBegan: withEvent: touchesMoved: withEvent:
touchesEnded: withEvent:

La substitution de ces trois méthodes semble être une technique largement utilisée (basée sur mes observations dans les forums). Cependant, dès que j'ai compilé ce code sur OS3, ces méthodes ne sont plus appelées. Quelqu'un d'autre a-t-il vu ce problème? Existe-t-il un correctif connu qui n'utilise pas de méthodes non documentées?

Ma première tentative de solution a été de déplacer toutes les méthodes touchesBegan / Moved / Ended dans ma vue de contenu et de les définir

.

delayContentTouches = NO; canCancelContentTouches = NO;

Cela fonctionnait partiellement, mais je ne pouvais pas effectuer de panoramique lorsque je zoomais Ma deuxième tentative ne définissait que canCancelContentTouches = NO lorsqu'il y avait deux contacts (transmettant ainsi le geste de pincement au contenu). Cette méthode était fragmentaire et ne fonctionnait pas très bien.

Des idées? Mon exigence est que la vue de défilement doit gérer les touches de panoramique et les touches de zoom.

Était-ce utile?

La solution

Ma solution n'est pas jolie. Fondamentalement, il existe une vue de défilement qui contient une vue de contenu. La vue de défilement n'implémente pas de touchesBegan, Moved, Ended. La vue de contenu conserve un pointeur sur son parent (appelé "parentScrollView" dans cet exemple). La vue de contenu gère la logique et utilise [parentScrollView setCanCancelContentTouches: ...] pour déterminer si la vue parent doit ou non annuler un événement tactile (et ainsi effectuer un événement de défilement). La logique du nombre de prises est là car les utilisateurs placent rarement les deux doigts à l'écran exactement au même moment. Le premier contact doit donc être ignoré s'il est suivi très rapidement par une seconde.

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    if(parentViewIsUIScrollView)
    {
        UIScrollView * parentScrollView = (UIScrollView*)self.superview;
        if([touches count] == 1)
        {
            if([[touches anyObject] tapCount] == 1)
            {   
                if(numberOfTouches > 0)
                {
                    [parentScrollView setCanCancelContentTouches:NO];
                    //NSLog(@"cancel NO - touchesBegan - second touch");
                    numberOfTouches = 2;
                }
                else
                {
                    [parentScrollView setCanCancelContentTouches:YES];
                    //NSLog(@"cancel YES - touchesBegan - first touch");
                    numberOfTouches = 1;
                }   
            }
            else
            {
                numberOfTouches = 1;
                [parentScrollView setCanCancelContentTouches:NO];
                //NSLog(@"cancel NO - touchesBegan - doubletap");
            }
        }
        else
        {       
            [parentScrollView setCanCancelContentTouches:NO];
            //NSLog(@"cancel NO - touchesBegan");
            numberOfTouches = 2;
        }
        //NSLog(@"numberOfTouches_touchesBegan = %i",numberOfTouches);
    }
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{   
    if(touchesCrossed)
        return;

    if(parentViewIsUIScrollView)
    {
        UIScrollView * parentScrollView = (UIScrollView*)self.superview;
        NSArray * thoseTouches = [[event touchesForView:self] allObjects]; 

        if([thoseTouches count] != 2)
            return;
        numberOfTouches = 2;


        /* compute and perform pinch event */

        [self setNeedsDisplay];
        [parentScrollView setContentSize:self.frame.size];
    }
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{   
    touchesCrossed = NO;
    if(parentViewIsUIScrollView)
    {
        numberOfTouches = MAX(numberOfTouches-[touches count],0);
        [(UIScrollView*)self.superview setCanCancelContentTouches:YES];
        //NSLog(@"cancel YES - touchesEnded");
        //NSLog(@"numberOfTouches_touchesEnded = %i",numberOfTouches);  
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top