Я пытаюсь создать макет, который будет структурирован следующим образом:
- View
-- ScrollView
--- ContentView
---- CustomView
---- CustomView
---- TableView
---- CustomView
Сам tableView
автоматически изменяет размер с помощью «invalidateIntrinsicContentSize», и когда я добавляю элементы, высота tableview
изменяется, сдвигая пользовательское представление под ним еще ниже.
После добавления достаточного количества элементов нижний настраиваемый вид скрывается, и прокрутка не работает.
важный факт - нижний пользовательский вид не имеет нижнего ограничения. Он отталкивается верхним ограничением на tableView
.
Если я установлю нижнее ограничение, табличное представление больше не будет динамически изменяться.
Предполагаемое поведение:
Когда пользователь добавляет элементы в список, и список становится слишком большим, ContentView будет прокручиваться, чтобы пользователь мог прокручивать, чтобы увидеть нижнюю часть view
.
Фактическое поведение: Когда пользователь добавляет элементы в список, а список становится слишком большим, нижний вид сдвигается вниз и выходит за пределы поля зрения, а содержимое не прокручивается.
Что происходит и как я могу это исправить?
Вы можете создать ограничение для высоты таблицы и взять его ссылку на свой быстрый файл, перетащив его при просмотре других представлений. Теперь в вашем коде просто сделайте это
tableViewHeightConstraint.constant = tableViewNoOfItems * tableViewCellHeight;
если вы отлично установили другие ограничения внутри прокрутки, это должно работать отлично. Означает, что TableView
должен иметь top
, bottom
, left
, right
ограниченные ограничения из ScrollView
.
Ниже то, что я думаю, что происходит.
Поскольку вы используете UITableView
, у него есть собственный вид прокрутки. Поэтому, когда список UITableView
становится слишком большим, сам UITableView становится прокручиваемым, а не ScrollView contentView становится прокручиваемым.
Чтобы достичь того, что вам нужно, вам нужно сделать UITableView
не прокручиваемым и использовать intrinsicHeight
UITableView
, чтобы получить фактическую высоту UITableView
вместе со всеми элементами. Если у вас есть элементы с разной высотой, это будет проблемой, потому что вы не будете знать высоту до рендеринга. При одинаковой высоте для всех строк вы можете получить общую высоту UITableView
и установить ограничение высоты на это значение. Это увеличит contentSize
внешнего ScrollView
, сделав его прокручиваемым.
Помимо UITableView
, вы также можете использовать UIStackView
. Это потому, что вы все равно не используете возможности повторного использования UITableView
. Управление datasource
и delegates
не должно быть большой проблемой.
попробуйте этот код
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
Я думаю, что вы могли бы сделать это:
tableView.isScrollEnabled = false
Кроме того, использование UIStackView с вертикальной осью и распределением .fillEqually
в качестве представления содержимого было бы намного удобнее, поскольку вам не нужно будет устанавливать какие-либо позиционные ограничения для ваших представлений, но может потребоваться установить ограничения по высоте, если внутренний размер содержимого не может быть определен двигатель
Спасибо за обзор и информацию. Это помогло мне лучше понять это и решить мою проблему.