Как настроить порог / расстояние при смахивании на UITableViewCell - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть смахиваемые ячейки таблицы.Намерение состоит в том, чтобы позволить пользователю полностью смахивать строки влево или вправо (полностью смахивать), и удаляемая строка удаляется из таблицы (например, как работает папка «Входящие от Gmail»).Все отлично работает, но у меня возник вопрос.

func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
    let swipeRightAction = UIContextualAction(style: .destructive, title:  "", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
        let item = self.myItems[indexPath.row]
        self.swipeRight(item) //do something
        self.myItems.remove(at: indexPath.row)
        success(true)
    })

    return UISwipeActionsConfiguration(actions: [swipeRightAction])
 }

Как я могу установить порог / расстояние (сколько пользователь должен пролистать, прежде чем действие будет предпринято)?В настоящее время пользователь должен провести на полпути, прежде чем строка удалится.Могу ли я изменить эту точку, чтобы пользователю понадобилось немного провести пальцем (скажем, 20% пути), чтобы смахнуть строку?

1 Ответ

0 голосов
/ 17 ноября 2018

Для него нет прямого метода настройки.

Решение

Но вы можете создать его самостоятельно:

  • добавить UIPanGestureRecognizerк таблице
  • разрешить одновременное распознавание жестов
  • , когда свайп заканчивается, проверить направление и вычислить процентную долю от перевода
  • определить строку соответствующей таблицы
  • удалить его

код

Проведите ячейки влево на 20%, что приведет к удалению строки, будет выглядеть так вкод:

class ViewController: UITableViewController, UIGestureRecognizerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        ...
        let swipeGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(onSwiped(_:)))
        swipeGestureRecognizer.delegate = self
        self.tableView.addGestureRecognizer(swipeGestureRecognizer)
    }

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }

    @objc private func onSwiped(_ gestureRecognizer: UIPanGestureRecognizer) {
        if gestureRecognizer.state == .ended {
            let translation = gestureRecognizer.translation(in: self.view)
            guard translation.x < 0 else { return }
            let width = self.tableView.bounds.width
            let percentage = -translation.x / width
            print("swiped left percentage:\(percentage)")
            if percentage > 0.2 {
                let location = gestureRecognizer.location(in: self.tableView)
                if let indexPath = self.tableView.indexPathForRow(at: location) {
                    print("delete row: \(indexPath.row)")
                    self.dataSource.remove(at: indexPath.row)
                    self.tableView.reloadData()
                }
            }
        }
    }

Демо

swipe 20% to delete row

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...