UITableView具有确定当前可见的单元格的方法。我想要找出的是一个细胞有多少是可见的。
例如,当您向下拖动表格时,表格顶部的“新显示”单元格不会出现,但一次只显示一条(像素)行,直到整个单元格可见。当拖动表格视图时,如何判断在任何给定时刻该单元格的可见程度。
我的最终目标是,当用户拖动桌面时,根据在任何给定时间可见的多少来更改单元格内的显示视图。
有什么建议吗?
答案 0 :(得分:5)
您可以尝试这样的事情:
-(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];
}
}
}
}
答案 1 :(得分:4)
我还没有测试过,但我会尝试以下方式:
UITableViewCell *cell;
UIView *parent = cell.superview;
CGRect overlap = CGRectIntersection(cell.frame, parent.bounds);
然后比较特定的矩形。
答案 2 :(得分:3)
以下是Swift中实现的上述变体:
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
是可见的单元格的一部分。可以添加另一个步骤来计算可见的单元格的比率 - 在0和1之间:
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
}
根据可见性更改视图外观 - 如上所述 - 此代码应包含在表格视图的UIScrollView超类委托UIScrollViewDelegate方法scrollViewDidScroll中。
但是,这只会在滚动时影响单元格。已经可见的细胞不会受到影响。对于这些代码,应在UITableViewDelegate方法didEndDisplayingCell中应用相同的代码。
答案 3 :(得分:2)
请参阅Vadim Yelagin的答案:https://stackoverflow.com/a/9843146/758298,其中解释了如何将单元格矩形转换为父表格视图坐标,并确定它是否完全可见。
答案 4 :(得分: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];
}
}