Изменение размера ScrollView на основе размера TableView

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

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

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

После добавления достаточного количества элементов нижний настраиваемый вид скрывается, и прокрутка не работает.

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

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

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

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

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
361
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

tableViewHeightConstraint.constant = tableViewNoOfItems * tableViewCellHeight;

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

Ответ принят как подходящий

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

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

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

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

Спасибо за обзор и информацию. Это помогло мне лучше понять это и решить мою проблему.

Yosi199 19.06.2019 16:31

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

        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

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

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

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

Другие вопросы по теме