Изменение размера ScrollView в зависимости от размера TableView - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь создать макет, который структурирован так:

 - View 
   -- ScrollView
       --- ContentView
            ---- CustomView
            ---- CustomView
            ---- TableView
            ---- CustomView

Сам по себе tableView можно изменять с помощью «invalidateIntrinsicContentSize», а когда я добавляю элементы, высота tableview изменяется, толкая пользовательское представление под ним еще ниже.

Как только добавлено достаточно элементов, нижний пользовательский вид скрыт и прокрутка не работает.

важный факт - нижний пользовательский вид не имеет нижнего ограничения. Это ограничено верхним ограничением до tableView.

Если я установлю нижнее ограничение - табличное представление больше не будет динамически изменяться.

Предполагаемое поведение: Когда пользователь добавляет элементы в список и список становится слишком большим, ContentView можно прокручивать, чтобы пользователь мог прокрутить, чтобы увидеть нижнюю часть view.

Фактическое поведение: Когда пользователь добавляет элементы в список, и список становится слишком большим, вид снизу перемещается вниз и находится вне поля зрения, а содержимое не прокручивается.

Что происходит и как я могу это исправить?

Ответы [ 4 ]

1 голос
/ 19 июня 2019

Ниже я думаю о том, что происходит.

Поскольку вы используете UITableView, он имеет собственный вид прокрутки. Поэтому, когда список UITableView становится слишком большим, сам UITableView становится прокручиваемым, а не ScrollView contentView становится прокручиваемым.

Чтобы достичь того, что вам нужно, вы должны отключить прокрутку UITableView и использовать intrinsicHeight из UITableView, чтобы получить фактическую высоту UITableView вместе со всеми предметами. Если у вас есть предметы с различной высотой, это будет проблемой, потому что вы не будете знать высоту до рендеринга. При одинаковой высоте для всех строк вы можете получить общую высоту UITableView и установить ограничение высоты на это значение. Это увеличит contentSize внешнего ScrollView, делая его прокручиваемым.

Помимо UITableView, вы также можете использовать UIStackView. Это потому, что вы все равно не используете возможности повторного использования UITableView. Управление datasource и delegates не должно быть большой проблемой.

1 голос
/ 19 июня 2019

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

tableViewHeightConstraint.constant = tableViewNoOfItems * tableViewCellHeight;

, если вы идеально установили другие ограничения внутри scrollview, он должен работать отлично.Значения TableView должны иметь top, bottom, left, right маржинальные ограничения из ScrollView.

0 голосов
/ 19 июня 2019

Я думаю, вы могли бы сделать следующее:

  1. Отключить прокрутку tableView tableView.isScrollEnabled = false
  2. Каждый раз, когда пользователь добавляет элементы в список, перезагрузите tableView

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

0 голосов
/ 19 июня 2019

попробуйте этот код

        tblViewHeight.constant = CGFloat( tableview row count * 45 ) 
        var size = contentView.systemLayoutSizeFitting(UILayoutFittingCompressedSize)
        if size.height < scrollView.frame.size.height
         {
            size = scrollView.frame.size
        }
        contenViewHeight.constant = size.height - scrollView.frame.size.height
        scrollView.contentSize.height = contenViewHeight.constant
...