Как resize таблицыHeaderView UITableView?

У меня возникли проблемы с изменением размера tableHeaderView. Это просто не работает.

1) Создайте UITableView и UIView (100 x 320 пикселей);

2) Установите UIView как tableHeaderView UITableView;

3) Постройте и идите. Все в порядке.

Теперь я хочу resize 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]; 

Дело в следующем: как resize таблицыHeaderView во время выполнения ???

Кто-нибудь может это сделать?

благодаря

IME

FYI: Я получил это для работы, изменив tableHeaderView и переустановив его. В этом случае я корректирую размер tableHeaderView, когда подвью UIWebView завершил загрузку.

 [webView sizeToFit]; CGRect newFrame = headerView.frame; newFrame.size.height = newFrame.size.height + webView.frame.size.height; headerView.frame = newFrame; [self.tableView setTableHeaderView:headerView]; 

Этот ответ старый и, по-видимому, не работает на iOS 7 и выше.

Я столкнулся с той же проблемой, и мне также нужны изменения для анимации, поэтому я сделал подclass UIView для моего заголовка и добавил эти методы:

 - (void)adjustTableHeaderHeight:(NSUInteger)newHeight{ NSUInteger oldHeight = self.frame.size.height; NSInteger originChange = oldHeight - newHeight; [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:1.0f]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, newHeight); for (UIView *view in [(UITableView *)self.superview subviews]) { if ([view isKindOfClass:[self class]]) { continue; } view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y - originChange, view.frame.size.width, view.frame.size.height); } [UIView commitAnimations]; } - (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context{ [(UITableView *)self.superview setTableHeaderView:self]; } 

Это существенно оживляет все подпрограммы UITableView, которые не являются тем же типом classа, что и вызывающий class. В конце анимации он вызывает setTableHeaderView в супервизии (UITableView) – без этого содержимое UITableView будет отскакивать при следующем прокрутке пользователя. Единственное ограничение, которое я нашел на этом до сих пор, заключается в том, что если пользователь пытается прокрутить UITableView во время анимации, прокрутка будет анимировать, как если бы вид заголовка не был изменен (неважно, если анимация быстро).

Если вы хотите условно анимировать изменения, вы можете сделать следующее:

 - (void) showHeader:(BOOL)show animated:(BOOL)animated{ CGRect closedFrame = CGRectMake(0, 0, self.view.frame.size.width, 0); CGRect newFrame = show?self.initialFrame:closedFrame; if(animated){ // The UIView animation block handles the animation of our header view [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.3]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; // beginUpdates and endUpdates trigger the animation of our cells [self.tableView beginUpdates]; } self.headerView.frame = newFrame; [self.tableView setTableHeaderView:self.headerView]; if(animated){ [self.tableView endUpdates]; [UIView commitAnimations]; } } 

Обратите внимание, что анимация состоит из двух частей:

  1. Анимация ячеек под tableHeaderView . Это делается с использованием beginUpdates и endUpdates
  2. Анимация фактического заголовка. Это делается с использованием UIView анимации UIView .

Чтобы синхронизировать эти две анимации, animationCurve должна быть установлена ​​в UIViewAnimationCurveEaseInOut и длительность до 0.3 , что, похоже, используется UITableView для ее анимации.

Обновить

Я создал проект Xcode на gihub, который делает это. Проверьте проект ResizeTableHeaderViewAnimated в besi / ios-quickies

Скриншот

Я думаю, что это должно сработать, если вы просто установите высоту myHeaderView следующим образом:

 CGRect newFrame = myHeaderView.frame; newFrame.size.height = newFrame.size.height + 100; myHeaderView.frame = newFrame; self.tableView.tableHeaderView = myHeaderView; 

Используется решение @garrettmoon выше до iOS 7.
Вот обновленное решение, основанное на @ garrettmoon’s:

 - (void)adjustTableHeaderHeight:(NSUInteger)newHeight animated:(BOOL)animated { [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:[CATransaction animationDuration]]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, newHeight); [(UITableView *)self.superview setTableHeaderView:self]; [UIView commitAnimations]; } - (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context{ [(UITableView *)self.superview setTableHeaderView:self]; } 

Это работало для меня на iOS 7 и 8. Этот код работает на controllerе табличного представления.

 [UIView animateWithDuration:0.3 animations:^{ CGRect oldFrame = self.headerView.frame; self.headerView.frame = CGRectMake(oldFrame.origin.x, oldFrame.origin.y, oldFrame.size.width, newHeight); [self.tableView setTableHeaderView:self.headerView]; }]; 

Это связано с установщиком tableHeaderView.

Перед установкой tableHeaderView вы должны установить высоту UIView. (Было бы намного проще, если бы Apple открывала исходники этой структуры …)

На iOS 9 и ниже tableHeaderView не tableHeaderView структуру после изменения размера. Эта проблема разрешена в IOS 10.

Чтобы решить эту проблему, просто сделайте это с помощью следующего кода:

 self.tableView.tableHeaderView = self.tableView.tableHeaderView; 

На iOS 9.x, делать это на viewDidLoad работает просто отлично:

 var frame = headerView.frame frame.size.height = 11 // New size headerView.frame = frame 

headerView объявляется как @IBOutlet var headerView: UIView! и подключен к раскадровке, где он располагается в верхней части таблицыView, чтобы функционировать как tableHeaderView.

Установка высоты для свойства tableView.tableHeaderView заголовка tableView.tableHeaderView в viewDidLoad кажется viewDidLoad , высота заголовка по-прежнему не изменяется, как ожидалось.

После борьбы с этим вопросом для многих попыток. Я обнаружил, что вы можете изменить высоту, вызвав логику создания представления заголовка внутри - (void)didMoveToParentViewController:(UIViewController *)parent метода - (void)didMoveToParentViewController:(UIViewController *)parent .

Таким образом, пример кода будет выглядеть так:

 - (void)didMoveToParentViewController:(UIViewController *)parent { [super didMoveToParentViewController:parent]; if ( _tableView.tableHeaderView == nil ) { UIView *header = [[[UINib nibWithNibName:@"your header view" bundle:nil] instantiateWithOwner:self options:nil] firstObject]; header.frame = CGRectMake(0, 0, CGRectGetWidth([UIScreen mainScreen].bounds), HeaderViewHeight); [_tableView setTableHeaderView:header]; } } 

Я обнаружил, что инициализатор initWithFrame в UIView неправильно соблюдает регистр, в который я проходил. Следовательно, я сделал следующее, которое отлично работало:

  - (id)initWithFrame:(CGRect)aRect { CGRect frame = [[UIScreen mainScreen] applicationFrame]; if ((self = [super initWithFrame:CGRectZero])) { // Ugly initialization behavior - initWithFrame will not properly honor the frame we pass self.frame = CGRectMake(0, 0, frame.size.width, 200); // ... } } 

Преимущество этого заключается в том, что он лучше инкапсулирован в ваш код просмотра.

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

 // Swift @IBAction func tapped(sender: UITapGestureRecognizer) { self.tableView.beginUpdates() // Required to update cells. // Collapse table header to original height if isHeaderExpandedToFullScreen { UIView.animateWithDuration(0.5, animations: { () -> Void in self.scrollView.frame.size.height = 110 // original height in my case is 110 }) } // Expand table header to overall screen else { let screenSize = self.view.frame // "screen" size UIView.animateWithDuration(0.5, animations: { () -> Void in self.scrollView.frame.size.height = screenSize.height }) } self.tableView.endUpdates() // Required to update cells. isHeaderExpandedToFullScreen= !isHeaderExpandedToFullScreen // Toggle } 

UITableView для изменения размера заголовка – UISearchBar со Scope Bar

Я хотел UITableView с UISearchBar как заголовок таблицы, поэтому у меня есть иерархия, которая выглядит так:

 UITableView | |--> UIView | |--> UISearchBar | |--> UITableViewCells 

Методы UISearchBarDelegate

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

 - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar { searchBar.showsScopeBar = YES; [UIView animateWithDuration:0.2f animations:^{ [searchBar sizeToFit]; CGFloat height = CGRectGetHeight(searchBar.frame); CGRect frame = self.tableView.tableHeaderView.frame; frame.size.height = height; self.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableHeaderView; }]; [searchBar setShowsCancelButton:YES animated:YES]; return YES; } - (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar { searchBar.showsScopeBar = NO; [UIView animateWithDuration:0.f animations:^{ [searchBar sizeToFit]; CGFloat height = CGRectGetHeight(searchBar.frame); CGRect frame = self.tableView.tableHeaderView.frame; frame.size.height = height; self.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableHeaderView; }]; [searchBar setShowsCancelButton:NO animated:YES]; return YES; } 

Если пользовательский заголовокView разработан с использованием автозапуска, а headerView необходимо обновить после веб-выборки или аналогичной ленивой задачи. затем в iOS-Swift я сделал это и получил обновленный заголовокView, используя следующий код:

 //to reload your cell data self.tableView.reloadData() dispatch_async(dispatch_get_main_queue(),{ // this is needed to update a specific tableview's headerview layout on main queue otherwise it's won't update perfectly cause reloaddata() is called self.tableView.beginUpdates() self.tableView.endUpdates() } 

Очевидно, что к настоящему времени Apple должна была внедрить UITableViewAutomaticDimension для tableHeaderView & tableFooterView …

Кажется, что для меня используются следующие ограничения:

 CGSize s = [ self systemLayoutSizeFittingSize : UILayoutFittingCompressedSize ]; CGRect f = [ self frame ]; f.size = s; [ self setFrame : f ]; 

Вы пытались [self.tableView reloadData] после изменения высоты?

  • Ячейка UITableView с фоновым изображением
  • Выбрать программную строку таблицы таблиц
  • Определите, видна ли ячейка таблицы.
  • indentationLevelForRowAtIndexPath не отступы пользовательской ячейки
  • Обнаружение, которое UIButton было нажато в UITableView
  • Данные перезагрузки UITableView
  • UITableViewCell расширяется по клику
  • UITableView didSelectRowAtIndexPath: не вызывается при первом нажатии
  • Использование не работает с UITableView seperatorColor?
  • Изменение цвета фона выбранной ячейки?
  • Использовать метод didSelectRowAtIndexPath или prepareForSegue для UITableView?
  • Давайте будем гением компьютера.