Frage

Ich habe eine Unterklasse von UIScrollView, die überschreiben

touchesBegan: withevent: touchesMoved: withevent:
touchesEnded: withevent:

Aufschalten diese drei scheint eine Technik zu sein, die weit verbreitet ist (basierend auf meinen Beobachtungen in Foren). Doch sobald ich diesen Code auf OS3 zusammengestellt werden diese Methoden nicht mehr aufgerufen werden. Hat jemand dieses Problem gesehen? Gibt es eine bekannte Update, das nicht ohne Papiere Methoden nicht verwendet?

Mein erster Versuch an einer Lösung, um alle touchesBegan / Verschoben / Ended Methoden nach unten in meine Inhaltsansicht und setzen Sie bewegen

delayscontenttouches = NO; canCancelContentTouches = NO;

Das funktionierte teilweise, aber ließ mich nicht in der Lage zu schwenken, wenn ich vergrößert haben. Mein zweiter Versuch nur canCancelContentTouches = NO gesetzt, wenn es zwei Berührungen waren (so die Pinch-Geste vorbei auf den Inhalt durch). Diese Methode war lückenhaft und nicht sehr gut funktionieren.

Irgendwelche Ideen? Meine Forderung ist, dass die Scroll-Ansicht, die die Pfanne berührt handhaben muss, und ich muss die Zoom berührt behandeln.

War es hilfreich?

Lösung

Meine Lösung ist nicht schön. Grundsätzlich gibt es eine Scroll-Ansicht, die einen Inhalt Ansicht enthält. Die Scroll-Ansicht implementiert nicht touchesBegan, verschoben, überhaupt beendet. Der Inhalt Ansicht hält einen Zeiger auf seine Eltern (so genannten „parentScrollView“ in diesem Beispiel). Der Inhalt Ansicht übernimmt die Logik und Anwendungen [parentScrollView setCanCancelContentTouches: ...], um zu bestimmen, ob die übergeordnete Ansicht lassen einen Hauch Ereignis abbrechen (und damit ein Scroll-Ereignis auslöst). Die Abgriff Zählungslogik ist es, weil die Benutzer selten beiden Finger platzieren Bildschirm genau zur gleichen Zeit, so dass die erste Berührung ignoriert werden muß, wenn es sehr schnell durch eine zweites folgt.

-(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);  
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top