2012-02-22 8 views
4

UITableViewには、現在表示されているセルを特定する方法があります。私が見つけようとしているのは、どのくらいの細胞が見えるかです。どのくらいのUITableViewCellが表示されているかを確認する方法

たとえば、テーブルの上にある「新しく表示される」セルをドラッグすると、表示されませんが、セル全体が表示されるまで一度に(ピクセル)表示されます。テーブルビューがドラッグされると、どの瞬間にそのセルがどれだけ表示されるかをどのように知ることができますか。

最終的な目的は、ユーザーがテーブルをドラッグすると、セル内の表示されているビューをいつでも表示できる程度に応じて変更することです。

提案がありますか?

答えて

4

私はそれをテストしていませんが、私はの線に沿って何かを試してみた:

UITableViewCell *cell; 
UIView *parent = cell.superview; 
CGRect overlap = CGRectIntersection(cell.frame, parent.bounds); 

は、特定の長方形を比較します。

2

ここでVadim Yelaginの答えをご覧ください:https://stackoverflow.com/a/9843146/758298ここでは、セルの矩形を親テーブルのビュー座標に変換し、それが完全に表示されているかどうかを判断します。

2

私はbshirleyのアドバイスなどを使ってこのようなことをしました。一度に数個の細胞しか見せない私のものの魅力のように働く。あなたはここでより多くの細胞

- (void) scrollViewDidEndDecelerating:(UITableView *)scrollView { 

NSArray *visibleCellIndexPaths = TableView.indexPathsForVisibleRows; 
NSIndexPath *indexPathLow = [visibleCellIndexPaths valueForKeyPath:@"@min.self"]; 
NSIndexPath *indexPathHigh = [visibleCellIndexPaths valueForKeyPath:@"@max.self"]; 

NSArray *cells = TableView.visibleCells; 

UITableViewCell *cell1 = [cells objectAtIndex:0]; 
UIView *parent1 = cell1.superview; 
CGRect overlap1 = CGRectIntersection(cell1.frame, parent1.bounds); 

UITableViewCell *cell2 = [cells objectAtIndex:1]; 
UIView *parent2 = cell2.superview; 
CGRect overlap2 = CGRectIntersection(cell2.frame, parent2.bounds); 

if (overlap1.size.height > overlap2.size.height) { 
    [TableView scrollToRowAtIndexPath:indexPathLow atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
} else { 
    [TableView scrollToRowAtIndexPath:indexPathHigh atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
} 

}

2

でこれを使用する場合はいくつかの調整が必要な場合がありますことスウィフトに実装上記のバリエーションです:セルの一部である

var cellRect = tableView.rectForRowAtIndexPath(indexPath) 
    if let superview = tableView.superview { 
     let convertedRect = tableView.convertRect(cellRect, toView:superview) 
     let intersect = CGRectIntersection(tableView.frame, convertedRect) 
     let visibleHeight = CGRectGetHeight(intersect) 
    } 

visibleHeightそれは目に見えるものです。視認性に応じて表示する外観を変更する

var cellRect = tableView.rectForRowAtIndexPath(indexPath) 
    if let superview = tableView.superview { 
     let convertedRect = tableView.convertRect(cellRect, toView:superview) 
     let intersect = CGRectIntersection(tableView.frame, convertedRect) 
     let visibleHeight = CGRectGetHeight(intersect) 
     let cellHeight = CGRectGetHeight(cellRect) 
     let ratio = visibleHeight/cellHeight 
    } 

- 上記の質問の状態として - このコードは、に含まれるべきである:表示されているセルの - 0と1の間の - 一のさらなるステップは、比率を計算するために添加することができますテーブルビューのUIScrollViewスーパークラスデリゲートUIScrollViewDelegateメソッドscrollViewDidScroll

ただし、スクロールするとセルにのみ影響します。すでに表示されているセルは影響を受けません。それらについては、同じコードをUITableViewDelegateメソッドdidEndDisplayingCellに適用する必要があります。

4

あなたはこのような何かを試すことができます。

-(void)scrollViewDidScroll:(UIScrollView *)sender 
{ 
    [self checkWhichVideoToEnable]; 
} 

-(void)checkWhichVideoToEnable 
{ 
    for(UITableViewCell *cell in [tblMessages visibleCells]) 
    { 
     if([cell isKindOfClass:[VideoMessageCell class]]) 
     { 
      NSIndexPath *indexPath = [tblMessages indexPathForCell:cell]; 
      CGRect cellRect = [tblMessages rectForRowAtIndexPath:indexPath]; 
      UIView *superview = tblMessages.superview; 

      CGRect convertedRect=[tblMessages convertRect:cellRect toView:superview]; 
      CGRect intersect = CGRectIntersection(tblMessages.frame, convertedRect); 
      float visibleHeight = CGRectGetHeight(intersect); 

      if(visibleHeight>VIDEO_CELL_SIZE*0.6) // only if 60% of the cell is visible 
      { 
       // unmute the video if we can see at least half of the cell 
       [((VideoMessageCell*)cell) muteVideo:!btnMuteVideos.selected]; 
      } 
      else 
      { 
       // mute the other video cells that are not visible 
       [((VideoMessageCell*)cell) muteVideo:YES]; 
      } 
     } 
    } 
} 
+0

おかげでチームメイト、私はそれほど明白今、CGRectIntersectionを使用する方法について考えていません! –

+1

うれしい – Catalin

関連する問題