iphone - uitableview scrolling performance



UITableView:以編程方式滾動內容視圖 (1)

我幾乎找到了一個合適的解決方案(它不像一個正常的滾動,但...)。

首先,我確定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是一個常數,用於線性增加scroolling的速度(沒有它touchesMoved:被稱為許多次,每次只給出一個像素的相對運動)
  • minYmaxY是預先計算的極限值(為了計算它們,我計算了表格中所有單元格的高度,以及最小值的可見內容視圖的高度)
  • 我添加了一些位移minYmaxY為了有一個更可見的動畫

嗨,我想轉發從UIView這是在UITableView前收到的。 但doins,所以我不能讓桌子滾動( 見這裡 )。

所以,現在我正在嘗試使tableview滾動編程,我看著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];
}

但結果真的是滯後和越野車。 更好的主意?





touch