2013-11-22 5 views
6

私はネットワークからフェッチしたメッセージを表示するテーブルビューを持っています。テーブルビューは、新しい行が挿入されたときに真ん中にスクロールします。

新しいメッセージが届くと、そのメッセージは下部のtableviewに追加されます。

新しいメッセージが入ったとき、それはテーブルビューの下部に正しく追加されますが、テーブルビューはすぐに真ん中にスクロールします。 (もし私が今ここで100のセルを言うなら、セル50はスクロールビューの真ん中にあるでしょう)。

これは、挿入前のスクロールポイントがテーブルビューの下半分にある場合にのみ発生します。

私は99のセル10を見ていて、行を追加すると、それはちょうどいいところに追加されます。

しかし、セル75が99の場合、行を追加すると、スクロール位置が中央(〜セル50)まで再びジャンプします。ここで

は、テーブルビューに新しいメッセージを追加するための私のコードです:

​​

はなぜテーブルビューは次のように自動的にスクロールしていますか?

+0

あなたのテーブルビューをスクロールする必要はありません? –

+0

@hussainShabbirユーザーの介入なしにスクロールしています。私は新しい行を追加するとき、私はそれが今やっている中央に自動的にスクロールしたくありません。 – Jeff

+0

@Jeffこの問題を解決する運がありますか?私は同じ問題があります。セルフサイジングセルを使用すると、それは狂ったようにジャンプしています。 –

答えて

0

私はあなたにも、あなたがmiddile、トップまたはnoneに位置を変更することができ、この

[self.tableView scrollToRowAtIndexPath:indexpath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

を試してみてください

[self.tableView 
insertRowsAtIndexPaths:indexPaths 
withRowAnimation: 
UITableViewRowAnimationNone]; 
+0

すべてのアニメーションタイプを試しましたが、すべて同じ結果があります。挿入後、テーブルビューが中央にスクロールします。 – Jeff

0

をなし - する行のアニメーションを変更する必要があると思います。

0

私もこの問題があります。 NSTableViewとUITableViewはおそらく類似しています...それらのデフォルトのスクロール動作は両方ともSUCKです。 TableViewは、スプレッドシートスタイルエディタとして使用するようには設計されていません。 何年にもわたって何千ものコード行を追加しました。 work のようにスプレッドシートです。 私は、Appleがちょうどすべてこのようなものを修正するためにNSTableViewのNSSpreadsheetViewのサブクラスを作成してほしい: - カーソルキーは、細胞 をナビゲート - 賢明なスクロール動作 を - アドホックセル選択追加

また、NSTableViewのNSLogViewサブクラスを見たいです検索フィールドと共にConsole.appのように動作します。

私のソリューションは、いくつかのカテゴリのメソッドを追加しました:

@implementation NSTableView (VNSTableViewCategory) 

-(NSInteger)visibleRow 
{ 
    NSRect theRect = [self visibleRect]; 
    NSRange theRange = [self rowsInRect:theRect]; 
    if (theRange.length == 0) 
     return -1; 
    else if (NSLocationInRange([self editedRow], theRange)) 
     return [self editedRow];   
    else if (NSLocationInRange([self clickedRow], theRange)) 
     return [self clickedRow];  
    else if (NSLocationInRange([self selectedRow], theRange)) 
     return [self selectedRow]; 
    else 
     return theRange.location + (theRange.length/2); 
} 

-(NSRange)visibleRows 
{ 
    NSRect theRect = [self visibleRect]; 
    NSRange theRange = [self rowsInRect:theRect]; 
    return theRange; 
} 

-(void)scrollRowToVisibleTwoThirds:(NSInteger)row 
{ 
    NSRect theVisRect = [self visibleRect]; 
    NSUInteger numRows = [self numberOfRows]; 
    NSRange visibleRows = [self rowsInRect:theVisRect]; 
    //NSUInteger lastVisibleRow = NSMaxRange(visibleRows); 
    if (NSLocationInRange(row, visibleRows)) 
    { 
     if (row - visibleRows.location < (visibleRows.length * 2/3)) 
     { 
     // may need to scroll up 
     if (visibleRows.location == 0) 
      [self scrollRowToVisible:0]; 
     else if ((row - visibleRows.location) > 2) 
      return; 
     } 
    } 

    NSRect theRowRect = [self rectOfRow:row]; 

    NSPoint thePoint = theRowRect.origin; 
    thePoint.y -= theVisRect.size.height/4; // scroll to 25% from top 

    if (thePoint.y < 0) 
     thePoint.y = 0; 

    NSRect theLastRowRect = [self rectOfRow:numRows-1]; 
    if (thePoint.y + theVisRect.size.height > NSMaxY(theLastRowRect)) 
     [self scrollRowToVisible:numRows-1]; 
    else 
    { 
     [self scrollPoint:thePoint]; // seems to be the 'preferred' method of doing this 

     // kpk note: these other approaches cause redraw artifacts in many situations: 
//  NSClipView *clipView = [[self enclosingScrollView] contentView]; 
//  [clipView scrollToPoint:[clipView constrainScrollPoint:thePoint]]; 
//  [[self enclosingScrollView] reflectScrolledClipView:clipView]; 
//  [self scrollRowToVisible:row]; 

//  [[[self enclosingScrollView] contentView] scrollToPoint:thePoint]; 
//  [[self enclosingScrollView] reflectScrolledClipView:[[self enclosingScrollView] contentView]];  
    } 

} 
@end // NSTableView (VNSTableViewCategory) 

使用例:

NSRange visRows = [toScenesTable visibleRows]; 
    visRows.length -= 2; 
    if (iAlwaysScroll == YES || !NSLocationInRange(row, visRows)) 
    { 
    [toScenesTable scrollRowToVisibleTwoThirds:row]; // VNSTableViewCategory 
    } 
関連する問題