Я создаю приложение, в котором будет UILabel
отображаться вопрос в виде ответов с несколькими вариантами ответов UITableView
, каждая строка отображает вариант с несколькими вариантами ответов . Вопросы и ответы будут разными, поэтому мне нужно, UITableView
чтобы они были динамичными по высоте.
Я хотел бы найти sizeToFit
обходной стол. Где рамка таблицы установлена на высоту всего ее содержимого.
Кто-нибудь может посоветовать, как мне этого добиться?
- sizeToFit
метод UIView ?Ответы:
На самом деле я нашел ответ сам.
Я просто создать новый
CGRect
дляtableView.frame
сheight
изtable.contentSize.height
Это устанавливает высоту
UITableView
наheight
его содержание. Поскольку код изменяет пользовательский интерфейс, не забудьте запустить его в основном потоке:источник
Решение Swift 5 и 4.2 без KVO, DispatchQueue или установки ограничений самостоятельно.
Это решение основано на ответе Гульца .
1) Создайте подкласс
UITableView
:2) Добавьте
UITableView
к вашему макету и установите ограничения со всех сторон. Установите класс этогоContentSizedTableView
.3) Вы должны увидеть некоторые ошибки, потому что раскадровка не учитывает наш подкласс
intrinsicContentSize
. Исправьте это, открыв инспектор размера и переопределив intrinsicContentSize для значения заполнителя. Это переопределение для времени разработки. Во время выполнения он будет использовать переопределение в нашемContentSizedTableView
классеОбновление: изменен код для Swift 4.2. Если вы используете предыдущую версию, используйте
UIViewNoIntrinsicMetric
вместоUIView.noIntrinsicMetric
источник
tableView
чтобы бытьIntrinsicTableView
в раскадровке. Мне не нужно было вставлять мой вид таблицы в другойUIView
.tableView
вIntrinsicTableView
. Также дополнительная упаковкаUIView
не требуется. Вы можете использовать любое существующее родительское представление, конечно :)tableView.sizeToFit()
sizeToFit()
нужно вызыватьБыстрое решение
Следуй этим шагам:
1- Установите ограничение высоты для таблицы из раскадровки.
2- Перетащите ограничение высоты из раскадровки и создайте для него @IBOutlet в файле контроллера представления.
3- Затем вы можете динамически изменять высоту таблицы, используя этот код:
Обновить
Если для вас вырезана последняя строка, попробуйте вызвать viewWillLayoutSubviews () в функции ячейки willDisplay:
источник
Я попробовал это в iOS 7, и это сработало для меня
источник
Добавьте наблюдателя для свойства contentSize в табличном представлении и соответственно измените размер кадра
затем в обратном вызове:
Надеюсь, что это поможет вам.
источник
У меня было табличное представление в представлении прокрутки и я должен был вычислить высоту tableView и соответственно изменить его размер. Вот шаги, которые я предпринял:
0) добавьте UIView в scrollView (возможно, будет работать без этого шага, но я сделал это, чтобы избежать возможных конфликтов) - это будет представление контейнеров для вашего табличного представления. Если вы сделаете этот шаг, то установите границы представлений прямо на те же, что и у таблицы.
1) создать подкласс UITableView:
2) установить класс табличного представления в раскадровке на IntrinsicTableView: снимок экрана: http://joxi.ru/a2XEENpsyBWq0A
3) Установите высоту ограничения для вашего вида таблицы
4) перетащите IBoutlet вашей таблицы на ваш ViewController
5) перетащите IBoutlet ограничения высоты вашей таблицы на ваш ViewController
6) добавьте этот метод в ваш ViewController:
Надеюсь это поможет
источник
Если вы не хотите самостоятельно отслеживать изменения размера содержимого табличного представления, этот подкласс может оказаться полезным.
источник
override public var intrinsicContentSize: CGSize { //... return someCGSize }
В случае, если ваш contentSize не является правильным, это потому, что он основан на оценочном RowHeight (автоматически), используйте это до
источник: https://forums.developer.apple.com/thread/81895
источник
Swift 3, iOS 10.3
Решение 1: Просто поместите
self.tableview.sizeToFit()
вcellForRowAt indexPath
функции. Убедитесь, что высота таблицы больше, чем вам нужно. Это хорошее решение, если у вас нет представлений под таблицей. Однако, если у вас есть, нижнее ограничение таблицы не будет обновлено (я не пытался это исправить, потому что я нашел решение 2)Пример:
Решение 2. Установите ограничение высоты табличного представления в раскадровке и перетащите его в ViewController. Если вы знаете среднюю высоту вашей ячейки и знаете, сколько элементов содержит ваш массив, вы можете сделать что-то вроде этого:
*РЕДАКТИРОВАТЬ:
После всех решений, которые я попробовал, и каждое из них что-то исправляло, но не полностью, этот ответ полностью объясняет и устраняет эту проблему.
источник
Ответ Mimo и ответ Anooj VM оба великолепны, но есть небольшая проблема, если у вас большой список, возможно, что высота кадра обрежет некоторые ваши ячейки.
Так. Я немного изменил ответ:
источник
Существует гораздо лучший способ сделать это, если вы используете AutoLayout: измените ограничение, которое определяет высоту. Просто рассчитайте высоту содержимого вашей таблицы, затем найдите ограничение и измените его. Вот пример (предполагая, что ограничение, которое определяет высоту вашей таблицы, на самом деле является ограничением высоты с отношением «Равно»):
источник
myTableHeightConstraint.constant = tableView.contentSize.height
Это работает для меня, используя Auto Layout, с табличным представлением только с одним разделом.
Я вызываю эту функцию при настройке Auto Layout (в данном примере используется SnapKit, но вы поняли):
Я хочу, чтобы UITableView был таким же высоким, как общая высота ячеек; Я перебираю клетки и накапливаю общую высоту клеток. Поскольку на данный момент размер табличного представления равен CGRect.zero, мне нужно установить границы, чтобы можно было соблюдать правила автоматической разметки, определенные ячейкой. Я установил размер на произвольное значение, которое должно быть достаточно большим. Фактический размер будет рассчитан позже системой Auto Layout.
источник
Я сделал немного по-другому, на самом деле мой TableView был внутри scrollview, поэтому я должен был задать ограничение высоты как 0.
Затем во время выполнения я сделал следующие изменения,
источник
В качестве дополнения к ответу Anooj VM, я предлагаю следующее, чтобы обновить размер контента только при его изменении.
Этот подход также отключает правильную прокрутку и поддерживает большие списки и ротацию . Нет необходимости в dispatch_async, потому что изменения contentSize отправляются в основной поток.
источник
объективная версия Musa almatri
источник
Вы можете попробовать этот обычай
AGTableView
Чтобы установить ограничение высоты TableView, используя раскадровку или программно. (Этот класс автоматически выбирает ограничение высоты и устанавливает высоту представления содержимого равной высоте вашего табличного представления).
Примечание Если возникнут проблемы с установкой высоты, тогда
yourTableView.layoutSubviews()
.источник
На основании ответа fl034 . Но для пользователей Xamarin.iOS :
источник
Моя реализация Swift 5 состоит в том, чтобы установить ограничение высоты tableView на размер его содержимого (
contentSize.height
). Этот метод предполагает, что вы используете автоматическое расположение. Этот код должен быть размещен внутриcellForRowAt
метода tableView.источник
Если вы хотите, чтобы ваша таблица была динамичной, вам нужно будет использовать решение на основе содержимого таблицы, как описано выше. Если вы просто хотите отобразить таблицу меньшего размера, вы можете использовать контейнерное представление и встроить в него UITableViewController - размер UITableView будет изменен в соответствии с размером контейнера.
Это позволяет избежать множества вычислений и призывов к макету.
источник
above
потому что ответы могут быть перемешаны.Мое решение для этого в быстрой 3 : вызвать этот метод в
viewDidAppear
источник