Swift-找出占据屏幕大部分的表格视图单元格

Swift-找出占据屏幕大部分的表格视图单元格,swift,uitableview,Swift,Uitableview,我有这个表视图,它的表视图单元格具有屏幕的宽度和高度。每个都显示一个图像。 在表格视图中滚动时,一个表格视图单元格可以占据整个屏幕。或者最多可以同时在应用程序的屏幕上看到2个表格视图单元格。 我的问题是:有没有办法找出这两个表视图单元格中哪一个比另一个占据更多屏幕高度?您可以尝试获取表视图的可视单元格,并检查这些单元格的来源。由于您在任何时候都有2个可视单元格,比较它们各自帧的y值可以告诉您哪个占据了更多的高度您可以尝试获取tableView的可视单元格并检查这些单元格的来源。由于您随时都会有2

我有这个表视图,它的表视图单元格具有屏幕的宽度和高度。每个都显示一个图像。 在表格视图中滚动时,一个表格视图单元格可以占据整个屏幕。或者最多可以同时在应用程序的屏幕上看到2个表格视图单元格。
我的问题是:有没有办法找出这两个表视图单元格中哪一个比另一个占据更多屏幕高度?

您可以尝试获取表视图的可视单元格,并检查这些单元格的来源。由于您在任何时候都有2个可视单元格,比较它们各自帧的y值可以告诉您哪个占据了更多的高度

您可以尝试获取tableView的可视单元格并检查这些单元格的来源。由于您随时都会有2个可视单元格,比较它们各自帧的y值可以告诉您哪个占据了更多的高度

查看第二个可视单元格(
tableView.visibleCells[1]
),并检查其
y
位置。如果它的高度小于tableView的一半,则会占用更多的屏幕空间,否则会占用更少的空间。你想怎么打就怎么打

编辑

给定indexPath的
y
位置是固定的,因此需要考虑tableView的
contentOffset

CGFloat yOrigin = [tableView.visibleCells[1] frame].origin.y - tableView.contentOffset.y;

查看第二个可见单元格(
tableView.visibleCells[1]
),并检查其
y
位置。如果它的高度小于tableView的一半,则会占用更多的屏幕空间,否则会占用更少的空间。你想怎么打就怎么打

编辑

给定indexPath的
y
位置是固定的,因此需要考虑tableView的
contentOffset

CGFloat yOrigin = [tableView.visibleCells[1] frame].origin.y - tableView.contentOffset.y;

下面是一个简单的方法,可以找出哪个细胞的可见率超过60%

func scrollViewDidScroll(scrollView: UIScrollView) {

    checkWhichVideoToEnable()
}

func checkWhichVideoToEnable() {

    for cell in tableView.visibleCells as [UITableViewCell] {

        if cell.isKindOfClass(UITableViewCell) {

            let indexPath = tableView.indexPathForCell(cell)
            let cellRect = tableView.rectForRowAtIndexPath(indexPath!)
            let superView = tableView.superview

            let convertedRect = tableView.convertRect(cellRect, toView: superView)
            let intersect = CGRectIntersection(tableView.frame, convertedRect)
            let visibleHeight = CGRectGetHeight(intersect)

            if visibleHeight > self.view.bounds.size.height * 0.6 {  // only if 60% of the cell is visible.

                //cell is visible more than 60%
                print(indexPath?.row) //your visible cell.
            }
        }
    }
}

参考。

这里有一个简单的方法,可以找出哪个单元格的可见率超过60%

func scrollViewDidScroll(scrollView: UIScrollView) {

    checkWhichVideoToEnable()
}

func checkWhichVideoToEnable() {

    for cell in tableView.visibleCells as [UITableViewCell] {

        if cell.isKindOfClass(UITableViewCell) {

            let indexPath = tableView.indexPathForCell(cell)
            let cellRect = tableView.rectForRowAtIndexPath(indexPath!)
            let superView = tableView.superview

            let convertedRect = tableView.convertRect(cellRect, toView: superView)
            let intersect = CGRectIntersection(tableView.frame, convertedRect)
            let visibleHeight = CGRectGetHeight(intersect)

            if visibleHeight > self.view.bounds.size.height * 0.6 {  // only if 60% of the cell is visible.

                //cell is visible more than 60%
                print(indexPath?.row) //your visible cell.
            }
        }
    }
}

引用自。

我试着这样做:打印(tableView.visibleCells[0].frame.origin.y)打印(tableView.visibleCells[1].frame.origin.y),无论我如何在屏幕上移动这两个单元格(更高或更低),前两个我得到:568和1136,而第二个和第三个我得到1136和1704。屏幕的大小似乎无关紧要,frame.origin.y不会改变。我试着这样做:打印(tableView.visibleCells[0].frame.origin.y)打印(tableView.visibleCells[1].frame.origin.y),无论我如何移动屏幕上的两个单元格(更高或更低),前两个我得到:568和1136,第二次和第三次我得到1136和1704。屏幕的大小似乎无关紧要,frame.origin.y不会改变。我试着这样做:打印(tableView.visibleCells[0].frame.origin.y)打印(tableView.visibleCells[1].frame.origin.y),无论我如何移动屏幕上的两个单元格(更高或更低),前两个我得到:568和1136,第二次和第三次我得到1136和1704。哪一个屏幕占得更多或更少似乎无关紧要,frame.origin.y不会改变。对。您必须考虑tableView的contentOffset。我会更新我的答案。这是因为view.fram总是指超级视图的内部坐标系。您可以将坐标转换为self.view的坐标。UIView具有用于点转换的内置方法。您也可以将其转换为主窗口或设备坐标,但当应用旋转时,加上设备的原点(0.0)与UIKit coodrinate系统不同,这可能会非常混乱。工作完美,Avi!非常感谢。为Swift编写了这样的代码:let yOrigin1:CGFloat=tableView.visibleCells[0]。frame.origin.y-tableView.contentOffset.y let yOrigin2:CGFloat=tableView.visibleCells[1]。frame.origin.y-tableView.contentOffset.y打印(“----------(yOrigin1)”)打印(----------(yOrigin2)”)我这样试过:打印(tableView.visibleCells[0].frame.origin.y)打印(tableView.visibleCells[1].frame.origin.y),无论我如何移动屏幕上的2个单元格(更高或更低),对于前两个,我得到:568和1136,而对于第二个和第三个,我得到1136和1704。这似乎并不重要,frame.origin.y没有改变。对。你必须考虑tableView的contentOffset。我会更新我的答案。这是因为view.fram总是指超级视图。您可以将坐标转换为self.view的坐标。UIView具有用于点转换的内置方法。您也可以将其转换为主窗口或设备坐标,但当应用旋转加上原点(0.0)时,这可能会非常混乱该设备的外观与UIKit coodrinate系统不同。工作正常,Avi!谢谢!为Swift编写了以下内容:let yOrigin1:CGFloat=tableView.visibleCells[0]。frame.origin.y-tableView.contentOffset.y let yOrigin2:CGFloat=tableView.visibleCells[1]。frame.origin.y-tableView.contentOffset.y打印(“----------(yOrigin1)”)打印(“----------(yOrigin2)”)