У меня проблемы с изменением размера tableHeaderView. Это просто не работает.
1) Создайте UITableView и UIView (100 x 320 пикселей);
2) Установите UIView как tableHeaderView для UITableView;
3) Строй и работай. Все в порядке.
Теперь я хочу изменить размер tableHeaderView, поэтому я добавляю этот код в viewDidLoad:
self.tableView.autoresizesSubviews = YES;
self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;
CGRect newFrame = self.tableView.tableHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
self.tableView.tableHeaderView.frame = newFrame;
Высота tableHeaderView должна отображаться как 200, но отображается как 100.
Если я напишу:
self.tableView.autoresizesSubviews = YES;
CGRect newFrame = myHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
myHeaderView.frame = newFrame;
self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;
Потом начинается с 200 высоты, как я хочу. Но я хочу иметь возможность изменять его во время выполнения.
Я тоже пробовал это, но безуспешно:
self.tableView.autoresizesSubviews = YES;
self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;
CGRect newFrame = self.tableView.tableHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
self.tableView.tableHeaderView.frame = newFrame;
[self.tableView.tableHeaderView setNeedsLayout];
[self.tableView.tableHeaderView setNeedsDisplay];
[self.tableView setNeedsLayout];
[self.tableView setNeedsDisplay];
Дело здесь в следующем: как изменить размер tableHeaderView во время выполнения ???
Кто-нибудь может это сделать?
Спасибо
iMe
[tableView recalculateHeaderHeight]
каждый раз.setTableHeaderView:
[tableview beginUpdates]
[tableview endUpdates]
Этот ответ старый и, по-видимому, не работает на iOS 7 и выше.
Я столкнулся с той же проблемой, и я также хотел, чтобы изменения были анимированы, поэтому я создал подкласс UIView для своего представления заголовка и добавил следующие методы:
По сути, это анимирует все подпредставления UITableView, которые не относятся к тому же типу класса, что и вызывающий класс. В конце анимации он вызывает setTableHeaderView в супервизоре (UITableView) - без этого содержимое UITableView вернется назад при следующей прокрутке пользователя. Единственное ограничение, которое я обнаружил до сих пор, заключается в том, что если пользователь пытается прокрутить UITableView во время анимации, прокрутка будет анимироваться, как если бы размер заголовка не был изменен (не имеет большого значения, если анимация быстрый).
источник
Если вы хотите условно анимировать изменения, вы можете сделать следующее:
Обратите внимание, что анимация состоит из двух частей:
tableHeaderView
. Это делается с помощьюbeginUpdates
иendUpdates
UIView
блока анимации.Чтобы синхронизировать эти две анимации
animationCurve
, необходимо установить значениеUIViewAnimationCurveEaseInOut
и продолжительность.0.3
, которые, похоже, использует UITableView для своей анимации.Обновить
Я создал проект Xcode на gihub, который делает это. Ознакомьтесь с проектом
ResizeTableHeaderViewAnimated
в besi / ios-quickiesисточник
Я думаю, это должно сработать, если вы просто установите высоту myHeaderView следующим образом:
источник
Использовалось решение @garrettmoon выше до iOS 7.
Вот обновленное решение, основанное на @garrettmoon:
источник
У меня это сработало на iOS 7 и 8. Этот код работает на контроллере табличного представления.
источник
Это потому, что установщик tableHeaderView.
Вы должны установить высоту UIView перед установкой tableHeaderView. (Было бы намного проще, если бы Apple открыла исходный код этого фреймворка ...)
источник
В iOS 9 и ниже
tableHeaderView
не меняет макет после изменения размера. Эта проблема решена в iOS 10.Чтобы решить эту проблему, просто сделайте это с помощью следующего кода:
источник
В iOS 9.x это
viewDidLoad
отлично работает:headerView
объявляется как@IBOutlet var headerView: UIView!
и подключается к раскадровке, где он размещается в верхней части tableView, чтобы функционировать как tableHeaderView.источник
Это только тогда, когда вы используете автоматический макет и устанавливаете
translatesAutoresizingMaskIntoConstraints = false
вид пользовательского заголовка.Самый лучший и простой способ - отменить
intrinsicContentSize
. ВнутреннеUITableView
используетсяintrinsicContentSize
для определения размера верхнего / нижнего колонтитула. После того, как вы переопределитеintrinsicContentSize
в своем пользовательском представлении, вам нужно сделать следующее:invalidateIntrinsicContentSize()
tableView.setNeedsLayout()
иtableView.layoutIfNeeded()
Тогда
UITableView
верхний / нижний колонтитул будет обновлен по вашему желанию. Нет необходимости устанавливать нулевой вид или сбрасывать.Одна вещь действительно интересная для
UITableView.tableHeaderView
or.tableFooterView
- это то, что онUIStackView
теряет способность управлять своимarrangedSubviews
. Если вы хотите использовать вUIStackView
качестве tableHeaderView или tableFooterView, вы должны вставлять в stackView вUIView
и переопределениеUIView
«SintrinsicContentSize
.источник
Для Swift 5 Протестированный код
Примечание: вам нужно указать все ограничения подвида сверху, снизу, впереди и в конце. Так он приобретет весь необходимый размер.
Ссылка взята из: https://useyourloaf.com/blog/variable-height-table-view-header/
источник
Настройка высоты для просмотра заголовка собственности
tableView.tableHeaderView
в ,viewDidLoad
кажется , не работа, заголовок высота вид еще не меняется , как и ожидалось.После борьбы с этой проблемой много попыток. Я обнаружил, что вы можете изменить высоту, вызвав логику создания представления заголовка внутри
- (void)didMoveToParentViewController:(UIViewController *)parent
метода.Таким образом, пример кода будет выглядеть так:
источник
Я обнаружил, что инициализатор initWithFrame UIView не соблюдает должным образом прямоугольник, который я передаю. Следовательно, я сделал следующее, которое отлично сработало:
Преимущество этого в том, что он лучше инкапсулируется в код вашего представления.
источник
UIScreen
- плохая идея, как вы будете повторно использовать свое представление?Я реализовал анимированное изменение высоты заголовка таблицы, чтобы при касании он расширялся до всего экрана. Однако код может помочь в других случаях:
источник
Заголовок изменения размера UITableView - UISearchBar с областью действия
Я хотел, чтобы
UITableView
вUISearchBar
качестве заголовка таблицы у меня была иерархия, которая выглядит такUISearchBarDelegate методы
Как было сказано в другом месте, если вы не установите TableViewHeader после его изменения, ничего не произойдет.
источник
Если настраиваемый headerView разработан с использованием автоопределения, а headerView необходимо обновить после веб-выборки или аналогичной ленивой задачи. затем в iOS-Swift я сделал это и обновил свой headerView, используя следующий код:
источник
Очевидно, к настоящему времени Apple должна была реализовать UITableViewAutomaticDimension для tableHeaderView и tableFooterView ...
Следующее, похоже, работает для меня с использованием ограничений (-ов) макета:
источник
Если ваш tableHeaderView - это веб-просмотр с регулируемым содержанием, вы можете попробовать:
Тестировал на iOS9 и iOS11, работал хорошо.
источник
Пробовали
[self.tableView reloadData]
после изменения высоты?источник
- [UITableView reloadData]
предназначен только для динамических представлений (ячеек), а также для заголовков разделов, которые, как вы, очевидно, думали, имели в виду;)