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

时间:2017-05-17 14:58:56

标签: ios uitableview nsnotificationcenter uitableviewrowaction

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

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

See the annotated portion

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

This is what I have managed so far :|

非常感谢任何帮助/指导! 提前谢谢!

1 个答案:

答案 0 :(得分:0)

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

示例代码:
在我的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
    }
}    

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

结果如下:

Final look