Как узнать, какая часть UITableViewCell видна - PullRequest
4 голосов
/ 22 февраля 2012

UITableView имеет методы для определения, какие ячейки видны в данный момент.Я пытаюсь выяснить, какая часть ячейки видима.

Например, при перетаскивании таблицы вниз по «вновь видимой» ячейке вверху таблицы не только появляются, но ипоявляется (пиксельная) линия за раз, пока не будет видна вся ячейка.Как я могу сказать, какая часть этой ячейки видна в любой данный момент при перетаскивании табличного представления.

Моя конечная цель состоит в том, чтобы, когда пользователь перетаскивает таблицу, изменить отображаемое представление внутри ячейки в зависимости от того, сколько его видно в данный момент времени.

Есть предложения?

Ответы [ 5 ]

5 голосов
/ 04 июня 2015

Вы можете попробовать что-то вроде этого:

-(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];
            }
        }
    }
}
4 голосов
/ 22 апреля 2015

Вот вариант вышеописанного, реализованного в 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 являющаяся частью видимой ячейки. Можно добавить еще один шаг, чтобы вычислить соотношение между нулем и единицей видимой ячейки:

    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 .

4 голосов
/ 22 февраля 2012

Я не проверял это, но я бы попробовал что-то вроде:

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

затем сравните конкретные прямоугольники.

2 голосов
/ 10 апреля 2013

Я использовал совет Бширли и некоторых других, чтобы сделать что-то подобное. Работает как брелок для моих вещей, который показывает только пару ячеек за раз. Может потребоваться некоторая настройка, если вы хотите использовать это с большим количеством ячеек

    - (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 голосов
/ 02 апреля 2012

См. Ответ Вадима Елагина здесь: https://stackoverflow.com/a/9843146/758298, который объясняет, как преобразовать прямоугольник ячейки в координаты представления родительской таблицы и определить, полностью ли он виден или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...