Как передать жест касания через точку на экране, которая отсутствует в UIEdgeInsets полноэкранного UITableView: - PullRequest
0 голосов
/ 03 октября 2018

Я создал экран, на котором у меня полноэкранный режим UITableView, я установил для него UIEdgeInsets, который я настроил следующим образом:

categoriesTableView.contentInset = UIEdgeInsets.init(top: HEADER_VIEW_HEIGHT, left: 0, bottom: 0, right: 0)

, где HEADER_VIEW_HEIGHT - это CGFloat = 160.

Это позволило мне добавить «представление заголовка» к UITableView, которое покрывается, когда я начинаю прокручивать UITableView (... и не застреваю над UITableView, какреальное представление заголовка будет).

Проблема: Проблема в том, что мне нужно иметь 3 интерактивных представления в представлении заголовка, поэтому я спроектировал 3 представления в раскадровке и настроил Tap Gesture Recognizersна них.Но когда я пытаюсь использовать их, жесты касания не пропускаются, выведите UITableView, даже если я вижу эти виды на экране (в результате конфигурации contentInset).Единственный способ сделать их доступными для нажатия / кликания - это установить для UITableView значение User Interaction Enabled в false (что я не могу сделать, потому что мне нужно, чтобы UITableView также можно было перетаскивать и нажимать).

Вопрос: Как бы я передавал события касания нижним кликабельным частям «вида заголовка», если он не покрыт UITableView в результате настройки contentInset?

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

enter image description here

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Обновление:

Приведенное ниже решение не является идеальным, но оно может дать вам направление для начала.

A) Установите верхнее ограничение tableView сверху вниз для ограничения заголовка.

B) Создать IBOutlet ограничения высоты представления заголовка в вашем ViewController

C) Прослушать ScrollViewDidScroll табличного представления и поместить код, подобный этому

func scrollViewDidScroll(_ scrollView: UIScrollView) {
            let y = scrollView.contentOffset.y
            if y > 50{
                if heightConstant.constant != 0{
                    view.layoutIfNeeded()
                    heightConstant.constant = 0
                    UIView.animate(withDuration: 0.5, delay: 0, options: .allowUserInteraction, animations: {
                        self.view.layoutIfNeeded()
                    }, completion: nil)

                }
            }else{
                view.layoutIfNeeded()
                heightConstant.constant = 160
                UIView.animate(withDuration: 0.5, delay: 0, options: .allowUserInteraction, animations: {
                    self.view.layoutIfNeeded()
                }, completion: nil)
            }
        }

Здесь 50 - это форма точкигде он должен начать анимацию.Это чем-то похоже на Складную панель инструментов в Android.Просто убедитесь, что headerView.isClipsToBounds = true.


Преобразуйте ваше представление заголовка в UITableViewCell и измените ваш UITableViewDataSource как

extension ViewController: UITableViewDataSource{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return section == 0 ? 1 : yourList.count
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 2
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if indexPath.section == 0{
            // set your header view here
        }else{
            // Your normal cell configuration
        }
    }
}

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

0 голосов
/ 03 октября 2018

У меня есть очень уродливое решение для этого ..

Теперь у вас есть табличное представление и ниже, что есть представление заголовка, верно?Добавьте еще одно представление поверх табличного представления, которое содержит 3 вложенных представления и все прозрачные в цвете.

Позиционируйте это вновь добавленное подпредставление так же, как в представлении заголовка (Либо путем программного предоставления того же кадра, что и заголовкаили путем подключения его верхнего, левого, нижнего и правого ограничений к представлению заголовка).Аналогичным образом расположите 3 вспомогательных представления этого нового представления так же, как и для представлений внутри представления заголовка.И дать жест касания подпредставлениям этого нового представления.Таким образом, наш пользователь будет думать, что он нажимает на представление заголовка, в то время как он фактически нажимает на это невидимое представление.

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

  1. Вызовметод делегата UIScrollViewDelegate scrollViewDidScroll () и внутри, если scrollView.contentOffset.y> = 160, установите для параметра «Взаимодействие с пользователем» значение false для этого нового добавленного представления и верните его в значение true, если scrollView.contentOffset.y <160. </p>

  2. Или изнутри scrollViewDidScroll () присвойте outletOfTopConstraintOfYourNewView.constant = -(scrollView.contentOffset.y), чтобы новое представление также двигалось вверх в соответствии с прокруткой, тем самым изменяя видимую область нажатия.

Еще одна не очень изящная идея ..

Вместо того, чтобы давать contentInset, добавьте еще один раздел в этом табличном представлении по 0-му индексу с единственной ячейкой, высота которой 160, пользовательВзаимодействие включено - ложно, а цвет прозрачен.Тогда вам не нужно беспокоиться о логике в scrollViewDidScroll ().

...