Выделите UITableViewCell как iMessage при длительном нажатии - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть простой чат, созданный с использованием UITableView.Я хочу добавить возможность выделить сообщение после долгого нажатия.На самом деле, я хочу создать такую ​​же функцию, как iMessage:

После долгого нажатия мы выделяем фон (более темный), выделяем сообщение, прокручиваем к этому сообщению и показываем * 1006.*

На данный момент мне удалось добавить только longPress и actionSheet

Длительное нажатие на реконгизатор на viewDidLoad:

let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(onCellLongPressed(gesture:)))
messagesTableView.addGestureRecognizer(longPressRecognizer)

onCellLongPressed функция:

@objc func onCellLongPressed(gesture: UILongPressGestureRecognizer) {

    if gesture.state == UIGestureRecognizerState.began {
        let touchPoint = gesture.location(in: self.messagesTableView)
        if let indexPath = messagesTableView.indexPathForRow(at: touchPoint) {
            self.messagesTableView.selectRow(at: indexPath, animated: true, scrollPosition: UITableViewScrollPosition.none)
            shareWithFriend()
        }
    }
}

@objc func shareWithFriend() {
    alert(style: .actionSheet, actions: [
        UIAlertAction(title: "Share with friend", style: .default, handler: { [weak self] (_) in
            print("SHARE HERE")
        }),
        UIAlertAction(title: "Cancel", style: .destructive),
        ])
}

func alert(_ title: String? = nil, message: String? = nil, style: UIAlertController.Style, actions: [UIAlertAction]) {
    let alertController = UIAlertController(title: title, message: message, preferredStyle: style)
    actions.forEach(alertController.addAction)
    present(alertController, animated: true)
}

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Как вы можете видеть, цвет фона находится над панелью навигации, так что я думаю, что есть дополнительный контроллер представления, более проницательно представленный над представлением коллекции, когда пользователь выбирает ячейку.

Я думаю, что это две разные иерархии представлений, которые выглядят как одна:

  • Один контроллер представления содержит всплывающий список
  • Один контроллер представления содержит копию выбранноговоздушный шар и несколько связанных действий

Вот дорожная карта:

  1. Обнаружение длительного нажатия в ячейках представления коллекции
  2. Скопируйте выбранный воздушный шар ипредставить его в дополнительном контроллере вида (ActionVC)
  3. Отрегулировать положение выбранного всплывающего окна внутри ActionVC.Если выбранный шарик находится под кнопкой будущего действия, его следует переместить.Если выбранный шарик никого не беспокоит, он должен быть представлен без каких-либо изменений.
  4. Отрегулируйте смещение содержимого представления сбора, чтобы отразить 3. Изменение должно быть выполнено рядом с 3, чтобы выглядеть так, как если бы ячейка была на самом делеперемещено.
  5. Обнаружение любого прикосновения к ActionVC
  6. Отклонить ActionVC

Вот пример проекта .

enter image description here

  • Чтобы скопировать всплывающее окно, я фактически создаю представление того же класса, что и класс, используемый в ячейке представления коллекции.Но вы могли бы использовать снимок.
  • Чтобы отрегулировать положение выбранного аэростата внутри ActionVC, я использовал ограничения с приоритетом.Один говорит «не будь под кнопкой действия», другой - «будь точно там, где была клетка».Я использовал простое преобразование координат для вычисления ожидаемой выбранной позиции воздушного шара внутри ActionVC.
  • Чтобы выполнить 3 вместе с 4, я использовал transitionCoordinator из ActionVC, но вы могли бы использовать простую анимациюзаблокировать и представить ActionVC без анимации.
0 голосов
/ 11 февраля 2019

Извините, если этот ответ не полностью удовлетворит ваш запрос, но надеюсь, что он вам поможет.

Ваш первоначальный код был верным, но вы не установили тип прокрутки.Поэтому я предлагаю вам использовать этот метод selectRow (at: animated: scrollPosition:) Просто установите положение прокрутки:

self.messagesTableView.selectRow(at: indexPath, animated: true, scrollPosition: UITableViewScrollPosition.top)

Это также выберет эту строку и, следовательно, вызовет следующий метод Tableview (_: didSelectRowAt:) .Таким образом, вам нужно будет реализовать логику выделения здесь:

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// your logic of changing color
    }

Затем вы должны выполнить аналогичное действие, но для отмены выбора строки используйте deselectRow (at: animated:) Я считаю, что это должно бытьсделано, когда пользователь закончил свое действие.Также вам необходимо реализовать аналогичную функцию tableView (_: didDeselectRowAt:) для возврата цвета назад:

override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
// change color back
}

Обновление: вы также можете использовать setHighlighted (_: animated:) метод для выделения ячейки.Таким образом, вы можете избежать использования selectRowAt / didSelectRowAt / didDeselectRowAt и прокрутки tableView, используя

tableView?.scrollToRow(at: indexPath, at: UITableViewScrollPosition.top, animated: true).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...