iPhone OS3 переходит на подклассы UIScrollView - PullRequest
0 голосов
/ 23 июня 2009

У меня есть подкласс UIScrollView, который переопределяет

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

Кажется, что переопределение этих трех методов широко используется (основываясь на моих наблюдениях на форумах). Однако, как только я скомпилировал этот код на OS3, эти методы больше не вызывались. Кто-нибудь еще видел эту проблему? Есть ли известное исправление, которое не использует недокументированные методы?

Моя первая попытка найти решение состояла в том, чтобы переместить все методы touchesBegan / Moved / Ended вниз в мое представление содержимого и установить

delaysContentTouches = NO; canCancelContentTouches = NO;

Это сработало частично, но я не смог панорамировать, когда увеличил масштаб. Моя вторая попытка установила canCancelContentTouches = NO только тогда, когда было два прикосновения (таким образом, жест жеста передавался контенту). Этот метод был отрывочен и работал не очень хорошо.

Есть идеи? Мое требование заключается в том, что представление прокрутки должно обрабатывать касания панорамирования, а я должен обрабатывать касания зума.

1 Ответ

1 голос
/ 23 сентября 2009

Мое решение не красивое. По сути, есть представление прокрутки, которое содержит представление содержимого. Представление прокрутки вообще не реализует прикосновения Began, Moved, Ended. Представление содержимого поддерживает указатель на своего родителя (в этом примере он называется parentScrollView). Представление содержимого обрабатывает логику и использует [parentScrollView setCanCancelContentTouches: ...], чтобы определить, следует ли разрешить родительскому представлению отменить событие касания (и, таким образом, выполнить событие прокрутки). Существует логика подсчета касаний, потому что пользователи редко помещают оба пальца на экран в одно и то же время, поэтому первое касание должно игнорироваться, если за ним очень быстро следует второе.

-(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);  
    }
}
...