编辑显示在表格视图部分标题顶部的行操作

时间:2018-07-17 10:10:33

标签: ios swift uitableview cocoa-touch ios11

在iOS 11上,如果表格视图样式为单元格编辑操作或滑动操作(仅适用于iOS 11),则显示在部分标题的上方设置为普通(不分组)。这似乎是默认功能,如果这是系统错误或我的实现有误,我正在徘徊。

我使用默认表视图实现和以下用于标题和编辑操作行的功能实现了演示应用程序:

标题标题

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return "Section \(section)"
    }

编辑行的操作

override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
        let firstAction = UITableViewRowAction(style: .normal, title: "Action1", handler: {_,_ in })
        let secondAction = UITableViewRowAction(style: .destructive, title: "Action2", handler: {_,_ in })
        return [firstAction, secondAction]
    }

跟踪滑动操作(新的实施方式仅在iOS 11上可用):

override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let action1 = UIContextualAction(style: .normal, title: "Action1", handler: {_,_,_ in })
        let action2 = UIContextualAction(style: .destructive, title: "Action2", handler: {_,_,_ in })
        return UISwipeActionsConfiguration(actions: [action1, action2])
    }

以下是截屏:如何显示编辑操作: Edit action overlapping section header

这仅在iOS 11上发生。我尝试过使用上述的两种方法,但是得到的结果相同。

您是否知道我可能如何解决此问题?这是 iOS 11系统错误吗?

1 个答案:

答案 0 :(得分:3)

对于遇到此问题的任何人,我都找到了一种解决方法,方法是将UITableViewHeaderFooterView类子类化,然后将layer's zPostion设置为1,这将更改窗口视图渲染中标题视图的顺序,这对我来说就解决了。

解决方案1:

open class HeaderFooterView: UITableViewHeaderFooterView {

    public override init(reuseIdentifier: String?) {
        super.init(reuseIdentifier: reuseIdentifier)

        if #available(iOS 11.0, *) {
            self.layer.zPosition = 1;
        }
    }
}

如果您不想继承UITableViewHeaderFooterView类的替代解决方法,则只是重写viewForHeaderInSection委托方法,然后在返回视图之前设置视图的zPosition。

解决方案2:

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "CustomHeader") as! CustomHeader

    headerView.title = "Header title"

    if #available(iOS 11.0, *) {
         headerView.layer.zPosition = 1;
    }

    return headerView
}