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

在类似于ios通知中心的表视图中编辑操作,ios,uitableview,nsnotificationcenter,uitableviewrowaction,Ios,Uitableview,Nsnotificationcenter,Uitableviewrowaction,我需要开发一个tableview,其中的行上的编辑操作与iOS Notification center上的类似。 到目前为止,我使用的资源都说我只能编辑编辑操作的背景颜色和宽度。我想要的是iOS通知中心中通知的自定义外观 请参见注释部分。这就是我想要的 这就是我迄今为止所做到的:| 任何帮助/指导都将不胜感激 提前谢谢 我最终创建了自己的视图作为“表视图”单元的一部分,并添加了自定义动画 示例代码: 在我的tableViewController中: override func viewDid

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

请参见注释部分。这就是我想要的

这就是我迄今为止所做到的:|

任何帮助/指导都将不胜感激

提前谢谢

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

示例代码:
在我的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"
                }
            }
        }
    }
}
在“我的表格视图”单元格中:

    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
    }
}    
仅供参考,我在编辑操作视图中添加了编辑按钮,即Read/View/Clear。相应的操作与我的tableViewCell类中的iActions连接

结果是:


我最终创建了自己的视图作为“表视图”单元格的一部分,并添加了自定义动画

示例代码:
在我的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"
                }
            }
        }
    }
}
在“我的表格视图”单元格中:

    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
    }
}    
仅供参考,我在编辑操作视图中添加了编辑按钮,即Read/View/Clear。相应的操作与我的tableViewCell类中的iActions连接

结果是:


您是否尝试过将图像用作:
action.backgroundColor=UIColor(patternImage:UIImage(名为:“rowActionPic”)!
@DashAndRest我尝试过……嗯……您看到我的行背景比实际行高稍微小了一点吗?所以,当我使用patternImage(我还设置了圆角以实现iOS通知中心的外观)时,我得到了一个接一个的重复图像。。。此外,我不知道如何更改每个操作中文本的颜色:|有用于添加滑动操作的自定义库-您可以查看它们的代码,并更改必要的部分。您能给我指出一些吗?您是否尝试过使用image as:
action.backgroundColor=UIColor(patternImage:UIImage(名为:“rowActionPic”)!)
@DashAndRest我做了……嗯……你看到我的行背景比实际行高略小了吗?所以,当我使用patternImage(我还设置了圆角以实现iOS通知中心的外观)时,我得到了一个接一个的重复图像。。。此外,我不知道如何更改每个操作中文本的颜色:|有用于添加滑动操作的自定义库-您可以查看它们的代码,并更改必要的部分。您能给我指一些吗?您好!你有类似于表视图单元格的通知的示例回购吗?嗯..对不起,我没有…我直接在代码中做了。希望你能找到解决办法。如果没有,请告诉我。如果可以的话,我很乐意帮忙。你好!你有类似于表视图单元格的通知的示例回购吗?嗯..对不起,我没有…我直接在代码中做了。希望你能找到解决办法。如果没有,请告诉我。如果可以的话,我很乐意帮忙。