Переупорядочение UITableView без управления переупорядочением - PullRequest
15 голосов
/ 11 апреля 2011

Мне нужно, чтобы пользователь мог переупорядочить UITableView следующим образом: он касается ячейки в течение заранее определенного периода (например, 1 секунды), затем он может перетаскивать ее поверх других ячеек.

Я знаю, как реализовать обнаружение «длинного прикосновения» с помощью распознавателя жестов, но как лучше всего реализовать возможность перетаскивания без использования элемента управления переупорядочением (пользователь должен перетаскивать ячейку из любой точки ячейки, не только из-за повторного заказа)?

Ответы [ 4 ]

6 голосов
/ 28 ноября 2017

Это старый вопрос, но вот решение, которое протестировано и работает с iOS 8 до 11 .

В вашем подклассе UITableViewCell попробуйте следующее:

class MyTableViewCell: UITableViewCell {
    weak var reorderControl: UIView?

    override func layoutSubviews() {
        super.layoutSubviews()

        // Make the cell's `contentView` as big as the entire cell.
        contentView.frame = bounds

        // Make the reorder control as big as the entire cell 
        // so you can drag from everywhere inside the cell.
        reorderControl?.frame = bounds
    }

    override func setEditing(_ editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: false)
        if !editing || reorderControl != nil {
            return
        }

        // Find the reorder control in the cell's subviews.
        for view in subviews {
            let className = String(describing: type(of:view))
            if className == "UITableViewCellReorderControl" {

                // Remove its subviews so that they don't mess up
                // your own content's appearance.
                for subview in view.subviews {
                    subview.removeFromSuperview()
                }

                // Keep a weak reference to it for `layoutSubviews()`.
                reorderControl = view

                break
            }
        }
    }
}

Это близко к Первое предложение Senseful , но статья, на которую он ссылается, больше не работает.

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

Самый важный недостаток этого - то, что вы изменяете системуструктура представления ячейки и ссылка на закрытый класс ( UITableViewCellReorderControl ).Похоже, что он работает должным образом для всех последних версий iOS, но вы должны убедиться, что он остается в силе каждый раз, когда выходит новая ОС.

4 голосов
/ 21 сентября 2011

Я решил вопрос о следующих шагах:

  1. Присоединение распознавателя жестов к UITableView.
  2. Определить, какая ячейка была нажата "длинным прикосновением". В этот момент создайте снимок выбранной ячейки, поместите его в UIImageView и поместите в UITableView. Координаты UIImageView должны соответствовать выбранной ячейке относительно UITableView (снимок выбранной ячейки должен перекрывать выбранную ячейку).
  3. Сохранение индекса выбранной ячейки, удаление выбранной ячейки и перезагрузка UITableView.
  4. Отключить прокрутку для UITableView. Теперь вам нужно изменить кадр снимка UIImageView, когда вы будете перетаскивать ячейку. Вы можете сделать это методом touchesMoved.
  5. Создайте новую ячейку и перезагрузите UITableView (у вас уже есть сохраненный индекс), когда палец пользователя покинет экран.
  6. Удалить снимок UIImageView.

Но это было нелегко сделать.

2 голосов
/ 28 января 2017

Для дальнейшего использования ... У меня была такая же проблема, я нашел другой вопрос ( Swift - Drag & Drop TableViewCell с Long Gesture Recognizer ) об этом, и кто-то предложил этот учебник: https://www.freshconsulting.com/create-drag-and-drop-uitableview-swift/ отлично сработало для меня

1 голос
/ 03 июля 2014

В статье Изменение порядка элементов UITableViewCell из любой точки касания обсуждается этот точный сценарий.

По существу вы делаете следующее:

  1. Найдите UITableViewCellReorderControl (частный класс).
  2. Разверните его так, чтобы он охватывал всю ячейку.
  3. Скрыть это.
  4. Теперь пользователь сможет перетаскивать ячейку из любого места.

Другое решение, Кулинарная книга: перемещение ячеек табличного представления с помощью жеста длинного нажатия , обеспечивает тот же эффект, выполняя следующие действия:

  1. Добавление распознавателя жестов длинного нажатия в представлении таблицы.
  2. Создать снимок ячейки при перетаскивании ячейки.
  3. По мере перетаскивания ячейки перемещайте снимок и вызывайте -[UITableView moveRowAtIndexPath:toIndexPath:].
  4. Когда жест закончится, скройте снимок ячейки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...