在类似于 ios 通知中心的 table 视图中编辑操作

Edit actions in a table view similar to ios notifications center

我需要开发一个 tableview,对看起来类似于 iOS 通知中心的行进行编辑操作。
到目前为止我使用的资源说我只能编辑背景颜色和编辑操作的宽度。我想要的是 iOS 通知中心中通知的自定义外观。

查看注释部分。这就是我想要的。

这是我到目前为止所管理的:|

任何帮助/指导将不胜感激!
提前致谢!

我最终创建了自己的视图作为 table 视图单元的一部分并添加了自定义动画。

示例代码:
在我的 tableViewController 中:

override func viewDidLoad() {
    super.viewDidLoad()
    ....

    let tapGesture = UITapGestureRecognizer.init(target: self, action: #selector(handleTap))
    tableView.addGestureRecognizer(tapGesture)

    let leftSwipeGesture = UISwipeGestureRecognizer.init(target: self, action: #selector(handleLeftSwipe(_:)))
    leftSwipeGesture.direction = .left
    tableView.addGestureRecognizer(leftSwipeGesture)

    let rightSwipeGesture = UISwipeGestureRecognizer.init(target: self, action: #selector(handleRightSwipe(_:)))
    rightSwipeGesture.direction = .right
    tableView.addGestureRecognizer(rightSwipeGesture)
}

func handleTap(_ gestureRecognizer: UISwipeGestureRecognizer) {
    let point = gestureRecognizer.location(in: self.tableView)
    if let indexPath = self.tableView.indexPathForRow(at: point) {
        var shouldSelectRow = false
        if indexPathBeingEdited != nil {
            if indexPath == indexPathBeingEdited {
                shouldSelectRow = true
            } else {
                //handle close of the cell being edited already
                if let previousEditedCell = tableView.cellForRow(at: indexPathBeingEdited!) as? NotificationCenterTableViewCell {
                    previousEditedCell.closeEditActions()
                    indexPathBeingEdited = nil
                }
            }
        } else {
            shouldSelectRow = true
        }
        if shouldSelectRow {
            tableView.selectRow(at: indexPath, animated: true, scrollPosition: .middle)
            tableView(tableView, didSelectRowAt: indexPath)
        }
    }
}

func handleLeftSwipe(_ gestureRecognizer: UISwipeGestureRecognizer) {
    let point = gestureRecognizer.location(in: self.tableView)
    if let indexPath = self.tableView.indexPathForRow(at: point) {
        if indexPathBeingEdited != nil {
            if indexPath == indexPathBeingEdited {
                //Do nothing
            } else {
                //handle close of the cell being edited already
                if let previousEditedCell = tableView.cellForRow(at: indexPathBeingEdited!) as? NotificationCenterTableViewCell {
                    previousEditedCell.closeEditActions()
                    indexPathBeingEdited = nil
                }
            }
        }
        //proceed with left swipe action
        if let cell = tableView.cellForRow(at: indexPath) as? NotificationCenterTableViewCell {
            cell.handleLeftSwipe(gestureRecognizer)
            let notification = notificationsArray[indexPath.section].notificationItems[indexPath.row]

            //Update the title of Read button
            if notification.isNotificationRead {
                cell.readUnreadButtonLabel.text = "Unread"
            } else {
                cell.readUnreadButtonLabel.text = "Read"
            }
            indexPathBeingEdited = indexPath
        }
    }
}

func handleRightSwipe(_ gestureRecognizer: UISwipeGestureRecognizer) {
    let point = gestureRecognizer.location(in: self.tableView)
    if let indexPath = self.tableView.indexPathForRow(at: point) {
        if indexPathBeingEdited != nil {
            if indexPath == indexPathBeingEdited {
                if let cell = tableView.cellForRow(at: indexPath) as? NotificationCenterTableViewCell {
                    cell.closeEditActions()
                    indexPathBeingEdited = nil
                    //Update the title of Read button
                    cell.readUnreadButtonLabel.text = "Read"
                }
            } else {
                //handle close of the cell being edited already
                if let previousEditedCell = tableView.cellForRow(at: indexPathBeingEdited!) as? NotificationCenterTableViewCell {
                    previousEditedCell.closeEditActions()
                    indexPathBeingEdited = nil
                    //Update the title of Read button
                    previousEditedCell.readUnreadButtonLabel.text = "Read"
                }
            }
        }
    }
}

在我的 table 视图单元格中:

    func handleLeftSwipe(_ gestureRecognizer: UISwipeGestureRecognizer) {
    if !isBeingEdited {
        //Action to open the edit buttons
        UIView.animate(withDuration: 0.5, animations: {
            self.notificationHolderViewLeadingConstraint.constant -= 248
            self.notificationHolderViewTrailingConstraint.constant -= 248

            self.editActionsView.isHidden = false
            self.layoutIfNeeded()
        }, completion: { (success) in

        })
        isBeingEdited = true
    }
}

func closeEditActions() {
    if isBeingEdited {
        //Action to open the edit buttons
        UIView.animate(withDuration: 0.5, animations: {
            self.notificationHolderViewLeadingConstraint.constant += 248
            self.notificationHolderViewTrailingConstraint.constant += 248

            self.editActionsView.isHidden = true
            self.layoutIfNeeded()
        }, completion: { (success) in

        })
        isBeingEdited = false
    }
}   


 override func draw(_ rect: CGRect) {
    if let viewToRound = editActionsView {
        let path = UIBezierPath(roundedRect:viewToRound.bounds,
                                byRoundingCorners:[.topRight, .topLeft, .bottomRight, .bottomLeft],
                                cornerRadii: CGSize(width: 20, height:  20))

        let maskLayer = CAShapeLayer()

        maskLayer.path = path.cgPath
        viewToRound.layer.mask = maskLayer
    }
}    

仅供参考,我有我的编辑按钮,即读取/查看/清除添加到 editActionsView。相应的操作与我的 tableViewCell class 中的 IBActions 挂钩。

结果是这样的: