9 Stimmen

Wie man feststellt, wie viel von einer UITableViewCell sichtbar ist

UITableView verfügt über Methoden, um festzustellen, welche Zellen gerade sichtbar sind. Was ich herauszufinden versuche, ist, wie viel von einer Zelle sichtbar ist.

Wenn Sie z. B. eine Tabelle nach unten ziehen, erscheint die "neu sichtbare" Zelle am oberen Rand der Tabelle nicht einfach, sondern eine (Pixel-)Zeile nach der anderen, bis die gesamte Zelle sichtbar ist. Wie kann ich feststellen, wie viel von dieser Zelle zu einem bestimmten Zeitpunkt sichtbar ist, wenn die Tabellenansicht verschoben wird?

Mein Ziel ist es, dass sich die Ansicht innerhalb der Zelle ändert, wenn der Benutzer auf der Tabelle zieht, je nachdem, wie viel davon gerade sichtbar ist.

Irgendwelche Vorschläge?

11voto

Max MacLeod Punkte 25175

Hier ist eine in Swift implementierte Variante des obigen Beispiels:

    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 der Teil der Zelle, der sichtbar ist. Ein weiterer Schritt kann hinzugefügt werden, um das Verhältnis - zwischen Null und Eins - der sichtbaren Zelle zu berechnen:

    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
    }

Um das Erscheinungsbild der Ansicht abhängig von der Sichtbarkeit zu ändern - wie in der Frage oben angegeben - sollte dieser Code in die Tabellenansicht aufgenommen werden UIScrollView übergeordnete Klasse delegieren, UIScrollViewDelegate Methode scrollViewDidScroll .

Dies wirkt sich jedoch nur auf die Zellen aus, während sie rollen. Zellen, die bereits sichtbar sind, sind davon nicht betroffen. Für diese sollte derselbe Code in der UITableViewDelegate Methode didEndDisplayingCell .

7voto

Catalin Punkte 1741

Sie können es so versuchen:

-(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];
            }
        }
    }
}

4voto

bshirley Punkte 8016

Ich habe es nicht getestet, aber ich würde etwas in der Art versuchen:

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

vergleichen Sie dann die einzelnen Rechtecke.

2voto

gamozzii Punkte 3901

Siehe Antwort von Vadim Yelagin hier: https://stackoverflow.com/a/9843146/758298 in dem erklärt wird, wie man das Rect einer Zelle in die Koordinaten der übergeordneten Tabellenansicht umwandelt und feststellt, ob sie vollständig sichtbar ist oder nicht.

2voto

Chris Klingler Punkte 5168

Ich habe den Rat von bshirley und einigen anderen genutzt, um so etwas zu machen. Funktioniert wie ein Charme für meine Sachen, die nur ein paar Zellen zu einer Zeit zeigt. Mai brauchen einige zwicken, wenn Sie dies mit mehr Zellen verwenden möchten

    - (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];
}

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X