如何隐藏UITableView中的第一节标题(分组样式)
由于使用分组样式的表格视图的devise在iOS 7中发生了很大的变化,因此我想隐藏(或删除)第一部分标题。 到目前为止,我还没有设法实现它。
有点简化,我的代码如下所示:
- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { if (section == 0) return 0.0f; return 32.0f; } - (UIView*) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { if (section == 0) { UIView* view = [[UIView alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 640.0f, 0.0f)]; return view; } return nil; } - (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section { if (section == 0) { return nil; } else { // return some string here ... } }
如果我返回一个0的高度,其他两个方法将永远不会被调用的部分索引0.然而,一个空的部分头还是用默认的高度绘制。 (在iOS 6中,这两个方法被调用,但是可见的结果是一样的。)
如果我返回一个不同的值,那么节标题将获得指定的高度。
如果我返回0.01,那几乎是正确的。 但是,当我在模拟器中打开“颜色未alignment的图像”时,它会标记所有的表格视图单元格(这似乎是合乎逻辑的结果)。
UITableView的问题的答案:从空白部分隐藏标题似乎表明,有人成功隐藏部分标题。 但它可能适用于朴素风格(而不是分组风格)。
到目前为止,最好的折衷办法是返回0.5的高度,导致导航栏下面有一些粗糙的线条。 不过,如果有人知道第一部分的标题可以完全隐藏,我将不胜感激。
更新
根据caglar的分析( https://stackoverflow.com/a/19056823/413337 ),只有在表格视图包含在导航控制器中时才会出现问题。
我有一个解决方法,似乎对我来说是相当干净。 所以我正在回答我自己的问题。
由于0作为第一节标题的高度不起作用,所以我返回1.然后我使用contentInset来隐藏导航栏下的高度。
- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { if (section == 0) return 1.0f; return 32.0f; } - (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section { if (section == 0) { return nil; } else { // return some string here ... } } - (void) viewDidLoad { [super viewDidLoad]; self.tableView.contentInset = UIEdgeInsetsMake(-1.0f, 0.0f, 0.0f, 0.0); }
答案对我和我的团队来说非常有趣, 而且像一个魅力
- 在Interface Builder中,只需在视图层次结构中的另一个视图下移动tableview。
原因:
我们观察到,如果这个第一个视图是一个UITableView的话 , 这只会发生在视图层次结构中的第一视图 。 所以,所有其他类似的UITableViews没有这个烦人的部分,除了第一个。 我们尝试将UITableView移出视图层次结构中的第一位,并且所有内容都按预期工作。
使用这个技巧分组typestableView
在viewDidLoad方法中复制下面代码中的表格视图粘贴:
tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tableView.bounds.size.width, 0.01f)];
这是如何隐藏UITableView中的第一节标题(分组样式)。
Swift 3.0和Xcode 8.0解决scheme
-
TableView的委托应该实现heightForHeaderInSection方法
-
在heightForHeaderInSection方法中,返回最小正数。 (不是零!)
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { let headerHeight: CGFloat switch section { case 0: // hide the header headerHeight = CGFloat.leastNonzeroMagnitude default: headerHeight = 21 } return headerHeight }
这样可以。
override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { if section == 0 { return CGFloat.min } return 25 } override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { if section == 0 { return nil }else { ... } }
我只是复制你的代码,并尝试。 它运行正常(在模拟器尝试)。 我附上结果视图。 你想要这样的观点吧? 或者我误解了你的问题?
更新[9/19/17]:旧的答案不适用于我在iOS 11中。谢谢苹果。 以下是:
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension; self.tableView.estimatedSectionHeaderHeight = 20.0f; self.tableView.contentInset = UIEdgeInsetsMake(-18.0, 0.0f, 0.0f, 0.0);
以前的答案:
正如克里斯·奥斯托莫 ( Chris Ostomo)在评论中所说的那样:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return CGFLOAT_MIN; // to get rid of empty section header }
Swift3:heightForHeaderInSection与0一起工作,你只需要确保header设置为clipsToBounds。
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 0 }
如果你没有设置clipsToBounds,隐藏的标题会在滚动时可见。
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { guard let header = view as? UITableViewHeaderFooterView else { return } header.clipsToBounds = true }
我还不能发表评论,但认为我会补充说,如果你的控制器上有一个UISearchController
和UISearchBar
作为你的tableHeaderView
,那么在heightForHeaderInSection
中将第一部分的高度设置为0确实有效。
我使用self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height);
这样search栏默认是隐藏的。
结果是第一部分没有标题,向下滚动将显示第一行上方的search栏。
最简单的是返回nil
,或""
在func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
对于您不希望显示标题的部分。
- 将核心数据添加到现有的iPhone项目
- UITableView中的声明失败configureCellForDisplay:forIndexPath:
- iPhone导航栏标题文字颜色
- 在代码生成的UIView上绘制UIBezierPath
- XCode 4.3无法加载持久性存储UserDictionary.sqlite
- 如何在没有IB的情况下在右侧的UINavigationbar中添加2个button?
- NS前缀是什么意思?
- iOS:如何将UIViewAnimationCurve转换为UIViewAnimationOptions?
- Xcode无法获取进程XXX的任务。 我如何解决这个问题? (iPhone SDK 4.0)