Swift: как бороться с tableView, когда ширина tableView больше размера экрана? - PullRequest
0 голосов
/ 02 мая 2018

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

Нижняя форма имеет следующие требования:

  1. 2 верхние строчки должны прилипать к голове и не позволять прокручиваться вверх / вниз. Для реализации я использую головку секции таблицы.

  2. все остальные строки можно прокручивать вверх / вниз и нажимать. Я использую табличное представление для реализации

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

  4. , когда данные строки представления таблицы отличаются от «currentBitting», который имеет значение «33342431», на отдельной метке должен отображаться цвет фона.

  5. каждый столбец должен быть выровнен для таблицы

Ниже приводится идея, как я реализую:

  1. Чтобы выполнить все эти требования, я использую tableView для реализации. Каждый символ в элементе массива использует метку для отображения.

  2. Я использую максимальную ширину и обычную ширину для определения ширины каждого столбца

  3. Когда размер шрифта текста изменяется, я пытаюсь установить нижний tableView contentSize = текущий новый размер контента в "viewWillLayoutSubViews ()"

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

В настоящее время проблема в том, что горизонтальная прокрутка не работает. Очень странно.

Если честно, я пробовал довольно много способов:

  1. Нижняя форма сначала использует родительский scrollView, затем помещает вложенный tableView. Проблема: верхний колонтитул плохо прилипает или вертикальная прокрутка не такая гладкая. Я вставил свою часть scrollViewDidScroll. Оно работает. Но вертикальная прокрутка не так гладко. Если кто-то может помочь улучшить его, я буду очень признателен.
    func scrollViewDidScroll(_ scrollView: UIScrollView) {

        let recognizer = scrollView.panGestureRecognizer

        let distance = recognizer.translation(in: scrollView)

        let deltaHeight:CGFloat = parentScrollView.contentSize.height - parentScrollView.frame.height

        let goingUp = distance.y < 0 //going up
        if distance.y != 0 {

            if goingUp {
                parentScrollView.contentOffset.y = 0
                switch recognizer.state {
                case .began,.changed:
                    if bottomTableview.contentOffset.y < deltaHeight {
                        bottomTableview.contentOffset.y -= distance.y
                        recognizer.setTranslation(.zero, in: scrollView)
                    }
                case .ended:
                    if bottomTableview.contentOffset.y > deltaHeight{
                        bottomTableview.contentOffset.y = deltaHeight
                        UIView.animate(withDuration: 0.1, animations: {
                            scrollView.layoutIfNeeded()
                        })
                    }
                default:
                    break 
                }  
            }
            else{
                switch recognizer.state {
                case .began,.changed:
                    if bottomTableview.contentOffset.y > 0 {
                        bottomTableview.contentOffset.y -= distance.y
                        recognizer.setTranslation(.zero, in: scrollView)
                    }
                case .ended:
                    if bottomTableview.contentOffset.y < 0 {
                        bottomTableview.contentOffset.y = 0
                        UIView.animate(withDuration: 0.1, animations: {
                            scrollView.layoutIfNeeded()
                        })
                    }
                default:
                    break
                } 
            }
        }
    }


  1. Сборник для реализации. Но я не знаю, как выбрать целую строку для получения данных и как вставить верхний заголовок

У кого-нибудь есть идея лучше реализовать этот случай? Очень признателен за вашу помощь.

Данные для использования в табличном представлении:

let extensionCodeArray = ["Position", "Current Bitting", "11407", "10253", "10492", "14195", "11665", "10547", "12332", "12536", "10211", "11034", "10725", "11036", "12928"]
let extensionResultBitting = ["12345678", "33342431", "33133244", "33243134", "32343134", "33134243", "31343234", "33342134", "31344233", "34342133", "31334342", "33134342", "34343132", "34231343", "32431343"]

ScreenShot

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Я решил проблему. Идея ниже:

  1. определить представление коллекции, установить его числоOfItemsInSection = 1
  2. для collectionView, установите его
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize --> return CGSize(width: contentSize.width, height: collectionView.frame.size.height)

Размер cotentSize рассчитывается заранее для окончательной формы

  1. Используется UICollectionViewCell, внутри которого реализуется источник данных tableView и delegate. Все datasource для tableView получаются из protocol, определенного в UICollectionViewCell. Outerside collectionView является delegate для protocol

Готово.

0 голосов
/ 02 мая 2018

Для первого решения, которое вы попробовали.

UITableView является подклассом UIScrollView, что означает, что UITableView также имеет событие scrollViewDidScroll(_ scrollView: UIScrollView).

Чтобы решить эту проблему, вы можете просто сделать следующее. Установите тег для tableView или scrollView, чтобы идентифицировать его.
1. Например, чтобы определить scrollView, добавьте следующую строку после того, где вы инициализировали scrollView.

scrollView.tag = 101  
  1. В func scrollViewDidScroll(_ scrollView: UIScrollView)
    func scrollViewDidScroll(_ scrollView: UIScrollView) 
     {
        if scrollView.tag == 101 { 
          // Triggered by scrollView
         } else { 
         // Triggered by tableView 
        }

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