Вопрос

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

Прикосновения начались:с событием:touchesMoved:С событием:
Завершенное касание:с событием:

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

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

delaysContentTouches = НЕТ;canCancelContentTouches = НЕТ;

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

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

Это было полезно?

Решение

Мое решение некрасиво.В основном существует вид прокрутки, который содержит представление содержимого.Вид прокрутки вообще не реализует touchesBegan, 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);  
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top