wake-up-neo.net

Durch Wischen zum Löschen der Zelle wird tableViewHeader mit der Zelle verschoben

Ich habe einen merkwürdigen Fehler mit meiner tableViewHeader auf meiner UITableView in iOS 8 festgestellt. Wenn Sie auf eine Zelle klicken, um die Schaltfläche "Löschen" (Standard-Wipe-to-Delete von iOS) anzuzeigen, wird die tableViewHeader zusammen mit der überzogenen Zelle verschoben. Wenn ich die Zelle übersteige, wird der Header auf dieselbe Weise wie die überzogene Zelle verschoben. Es werden keine anderen Zellen in der Tabellensicht verschoben, sondern nur der Kopf und die Zelle, die gerade gewechselt wird. Ich habe dies auf iOS 7 getestet, das Problem ist jedoch noch nicht aufgetreten. Für mich scheint dies ein Fehler mit tableViewHeader in iOS 8 zu sein, da es nur in dieser Version vorkommt und etwas scheint, was niemals vorkommen sollte. Ich sehe keinen Grund dafür, dass der Header jemals in Swipe-to-Delete enthalten ist.

Hier ist nur ein Modell. Zu löschendes Wischen innerhalb der App ist standardmäßig iOS und nicht benutzerdefiniert.

Below is just a mockup. Swipe-to-delete within the app is default iOS, nothing custom.

53
ferris

Aufbauend auf der Antwort von Ferris fand ich den einfachsten Weg, wenn Sie eine UITableViewCell als Abschnittsheader verwenden, die contentView der Zelle in viewForHeaderInSection zurückzugeben. Der Code lautet wie folgt:

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let  cell : cellSectionHeader = tableView.dequeueReusableCellWithIdentifier("SectionHeader") as cellSectionHeader
    return cell.contentView
    //cellSectionHeader is my subclassed UITableViewCell
}
49
Brad C

Dies wurde verursacht, weil ich eine UITableViewCell als Header für die Tabelle verwendet habe. Um das Swiping-Problem zu lösen, verwende ich anstelle von tableView.tableHeaderView = cell Folgendes:

UIView *cellView = [[UIView alloc] init];
[cellView addSubview:cell];
tableView.tableHeaderView = cellView

Ich weiß nicht, warum dies das Problem löst, insbesondere, dass es unter iOS 7 funktioniert hat, aber es scheint das Problem zu lösen.

Stellen Sie sicher, dass Sie der Zellansicht alle Ansichten hinzufügen, wie es für die Zellen contentView vorgesehen ist. Andernfalls reagieren die Schaltflächen nicht. 

Werke:

[cell addSubview:view]; oder [self addSubview:view];

Funktioniert nicht

[cell.contentView addSubview:view] oder [self.contentView addSubview:view]

25
ferris

Um zu vermeiden, dass sich die Kopfzeilen mit den Zellen bewegen, müssen Sie die contentView der Zelle in viewForHeaderInSection zurückgeben. Wenn Sie über eine untergeordnete UITableViewCell mit dem Namen SectionHeaderTableViewCell verfügen, ist dies der richtige Code:

-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    SectionHeaderTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionHeader"];
    //Do stuff to configure your cell
    return cell.contentView; 
}
9
bodagetta

Swift 3.0 Getestete Lösung. Wie im ersten Beispiel für Objective-C erwähnt; Der Schlüsselpunkt ist die Rückgabe von cell.contentView anstelle von cell Die neue Formatsyntax lautet wie folgt.

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    // HeaderCell is the name of custom row designed in Storyboard->tableview->cell prototype
    let cell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell")

    cell.songLabel.text = "Your Section Name"
    return cell.contentView
}
3
Trevor

Ein Problem, das bei der .contentView-Methode nicht erwähnt wird, besteht darin, dass Sie möglicherweise nicht das gewünschte Verhalten erhalten, wenn in Ihrer Tabellensichtzelle layoutSubviews verwendet wird, da layoutSubviews nicht aufgerufen wird. Am Ende stellte ich eine völlig separate UIView-Unterklasse her, die sowohl den normalen Zellen- als auch den Header-Vorgang unterstützt, und erstellte eine minimale UITableView-Zellklasse, die diese verwendet.

0
Chris Prince

Versuchen Sie, diese Methode zu implementieren, und geben Sie geeignete Bedingungen für die Überprüfung des Swipe an. Wenn diese Methode für die Kopfansicht aufgerufen wird.

1.tableView: processingStyleForRowAtIndexPath: 2.tableView: titleForDeleteConfirmationButtonForRowAtIndexPath: 3.tableView: shouldIndentWhileEditingRowAtIndexPath:

0
iOSdev