Domanda

Ho una sottoclasse di UIScrollView che sostituisce

touchesBegan: withEvent: touchesMoved: withEvent:
touchesEnded: withEvent:

Sovrascrivere questi tre sembra essere una tecnica ampiamente utilizzata (sulla base delle mie osservazioni nei forum). Tuttavia, non appena ho compilato questo codice su OS3, questi metodi non vengono più chiamati. Qualcun altro ha visto questo problema? Esiste una correzione nota che non utilizza metodi non documentati?

Il mio primo tentativo di soluzione è stato quello di spostare tutti i metodi Touch / Move / Ended nella mia visualizzazione dei contenuti e impostare

delaysContentTouches = NO; canCancelContentTouches = NO;

Questo ha funzionato parzialmente, ma non mi è stato possibile eseguire la panoramica quando ho ingrandito. Il mio secondo tentativo ha impostato canCancelContentTouches = NO solo quando c'erano due tocchi (passando così il gesto di pizzicamento al contenuto). Questo metodo era impreciso e non funzionava molto bene.

Qualche idea? Il mio requisito è che la vista di scorrimento debba gestire i tocchi di panoramica e io devo gestire i tocchi di zoom.

È stato utile?

Soluzione

La mia soluzione non è carina. Fondamentalmente c'è una vista di scorrimento che contiene una vista del contenuto. La vista di scorrimento non implementa tocchi Inizio, Spostato, Terminato. La visualizzazione del contenuto mantiene un puntatore al suo genitore (chiamato "quotScrollView" in questo esempio). La vista contenuto gestisce la logica e utilizza [parentScrollView setCanCancelContentTouches: ...] per determinare se consentire alla vista padre di annullare un evento touch (e quindi eseguire un evento scroll). La logica del conteggio dei tocchi è presente perché gli utenti raramente posizionano entrambe le dita sullo schermo esattamente allo stesso tempo, quindi il primo tocco deve essere ignorato se seguito molto rapidamente da un secondo.

-(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);  
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top