如何调整UITableView的tableHeaderView?

我无法调整tableHeaderView的大小。 它简单不工作。

1)创build一个UITableView和UIView(100 x 320像素);

2)将UIView设置为UITableView的tableHeaderView;

3)build立和去。 一切都好。

现在,我想调整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的大小?

有没有人能够做到这一点?

谢谢

仅供参考:通过修改tableHeaderView并重新设置,我已经得到了这个工作。 在这种情况下,我调整UIWebView子视图加载完成时tableHeaderView的大小。

 [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及以上版本。

我遇到了同样的问题,我也想改变animation,所以我做了我的头视图的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的所有子视图,它们与调用类不是相同的类types。 在animation结束时,它调用superview(UITableView)上的setTableHeaderView – 没有这个UITableView的内容将在用户下一次滚动时跳回。 我迄今发现的唯一的限制是,如果用户试图在animation发生时滚动UITableView,滚动将animation,就好像标题视图没有resize(如果animation是快)。

如果您想有条件地为更改设置animation,可以执行以下操作:

 - (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]; } } 

请注意,animation是双折的:

  1. tableHeaderView下的单元格的animation。 这是使用beginUpdatesendUpdates
  2. 实际标题视图的animation。 这是使用UIViewanimation块完成的。

为了同步这两个animation,必须将animationCurve设置为UIViewAnimationCurveEaseInOut ,持续时间为0.3 ,这似乎是UITableView用于animation的。

更新

我在gihub上创build了一个Xcode项目。 在besi / ios-quickies中检出项目ResizeTableHeaderViewAnimated

截图

我认为这应该工作,如果你只是像这样设置myHeaderView的高度:

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

以上使用@garrettmoon解决scheme,直到iOS 7。
以下是基于@ garrettmoon的更新解决scheme:

 - (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上适用于我。这个代码在桌面视图控制器上运行。

 [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的setter。

您必须在设置tableHeaderView之前设置UIView高度。 (如果苹果公开源代码这个框架会容易得多…)

在iOS 9和更低版本中,resize后, 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! 并连接到故事板上,放置在tableView的顶部,作为tableHeaderView。

viewDidLoad设置标题视图属性tableView.tableHeaderView高度似乎不起作用,标题视图高度仍然没有按预期的那样改变。

对这个问题进行了多次尝试。 我发现,您可以通过调用- (void)didMoveToParentViewController:(UIViewController *)parent方法中的标题视图创build逻辑来更改高度。

所以示例代码看起来像这样:

 - (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]; } } 

我发现UIView的initWithFrame初始化方法并没有正确地遵守我传入的矩形。因此,我做了以下工作,

  - (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); // ... } } 

这样做的好处是它可以更好地封装到你的视图代码中。

我已经实现了表格标题的animation高度变化,以便在点击时展开到整个屏幕。 但是,代码可以在其他情况下帮助:

 // 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与范围栏

我想要一个带有UISearchBarUITableView作为表头,所以我有一个像这样的层次结构

 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; } 

如果自定义headerView是使用autolayoutdevise的,并且需要在网页抓取或类似的懒惰任务之后更新headerView。 然后在iOS-Swift中,我做到了这一点,并使用下面的代码更新了我的headerView:

 //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() } 

你改变高度后尝试[self.tableView reloadData]吗?