UITableView: программная прокрутка просмотра содержимого - PullRequest
0 голосов
/ 11 августа 2010

Привет, я пытаюсь переслать прикосновения, которые я получаю от UIView, который находится перед UITableView.Но делает так, что я больше не могу делать прокрутку таблицы ( см. Здесь ).

Так что теперь я пытаюсь программно прокрутить просмотр таблицы, и я смотрю на setContentOffset:animated: иscrollRectToVisible:animated: с успехом только с первым.
Вот мой код в классе, который подклассифицирует UITableView:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"BEGTB");
    //previousXPan = 0.0;

    UITouch * touch = [touches anyObject];
    CGPoint tPoint = [touch locationInView:self]; 
    previousYPan = tPoint.y;

    [super touchesBegan:touches withEvent:event];
    //
    //[super touchesShouldBegin:touches withEvent:event inContentView:self];
    //[[self nextResponder] touchesBegan:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch * touch = [touches anyObject];
    CGPoint tPoint = [touch locationInView:self]; 


    NSLog(@"MOVTB");
    NSLog(@"BOUNDZ %f, %f, %f, %f", self.bounds.origin.x, self.bounds.origin.y, self.bounds.size.height, self.bounds.size.width);
    NSLog(@"CONTENT SIZE  %f, %f",  self.contentSize.height, self.contentSize.width);

    CGRect rc = [self bounds];
    NSLog(@"%f %f", rc.size.height, rc.size.width);
    CGRect newRect = CGRectMake(rc.origin.x, rc.origin.y + self.contentSize.height, self.contentSize.width, fabs(tPoint.y - previousYPan));
    NSLog(@"BOND RECT %f, %f, %f, %f", rc.origin.x, rc.origin.y, rc.size.height, rc.size.width);
    NSLog(@"NEW RECT %f, %f, %f, %f", newRect.origin.x, newRect.origin.y, newRect.size.height, newRect.size.width);
    //[self scrollRectToVisible:newRect animated:YES];
    NSLog(@"Content OFFSET %f",tPoint.y - previousYPan);
    [self setContentOffset:CGPointMake(rc.origin.x,(tPoint.y - previousYPan) *2.0 )animated:YES];
    previousYPan = tPoint.y;
    //[super touchesMoved:touches withEvent:event];
    //[[self nextResponder] touchesMoved:touches withEvent:event];
}

Но результат действительно отстает и глючит.Есть идея получше?

1 Ответ

0 голосов
/ 17 августа 2010

Я почти нашел подходящее решение (это не похоже на обычную прокрутку, но ...).

Сначала я определяю максимальное и минимальное количество пикселей в области содержимого представления таблицы на Yось (высота contentSize , когда представление полностью загружено ).

Я проверяю движение, выполненное постепенно, но не ссылаясь на позицию касания в виде таблицы!Я должен проверить это на верхнем слое UIView, который покрывает его, потому что, когда вы изменяете смещение содержимого таблицы, вы динамически изменяете ее размеры и вы можете закончить, получив эффект ускорения .

Вот некоторый код:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch * touch = [touches anyObject];

    CGPoint tPoint = [touch locationInView:[viewController draggableAreaView]];



    CGRect rc = [self bounds];


    float totalOS = tPoint.y - previousYPan;
    if ((contentOffSetY >= minY && contentOffSetY <= maxY) ||
        (contentOffSetY < minY - 5 && totalOS < 0) ||
        (contentOffSetY > maxY + 5 && totalOS > 0))
    {

        if (totalOS > 0)
            totalOS += OFFSET;
        else if (totalOS < 0)
            totalOS -= OFFSET;
        [self setContentOffset:CGPointMake(rc.origin.x,self.contentOffset.y + totalOS)animated:NO];

    }
    else /*if (contentOffSetY < minY - 5 && totalOS < 0) */
    {
        [self resetOffset];
    }
    previousYPan = tPoint.y; 

}

- (void)resetOffset{

    CGRect rc = [self bounds];
    if(contentOffSetY < minY)
    {
        [self setContentOffset:CGPointMake(rc.origin.x, minY + 50)animated:YES];
    }
    else if (contentOffSetY > maxY)
    {
        [self setContentOffset:CGPointMake(rc.origin.x, maxY - 50)animated:YES];
    }
}

Еще несколько советов:

  • здесь draggableAreaView - это верхний UIView, из которого я получаю «абсолютную» позицию
  • OFFSETявляется константой, определенной для приращения линейно скорости скроллинга (без нее touchesMoved:, вызываемый много раз, дает относительное движение только на один пиксель каждый раз)
  • , minY и maxY - предварительно рассчитанные предельные значения (для их вычисления я рассчитал высоту всех ячеек в таблице для максимального значения и высоту видимого представления содержимого для минимального значения)
  • Я добавил некоторое смещениена minY и maxY, чтобы иметь более заметную анимацию
...