由于使用分组样式的表格视图设计在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,那几乎是正确的。但是,当我在模拟器中打开“颜色未对齐图像”时,它会标记所有表格视图单元格(这似乎是合乎逻辑的结果)。
问题UITableView: hide header from empty section的答案似乎表明有些人成功隐藏了部分标题。但它可能适用于普通样式(而不是分组样式)。
到目前为止,最好的折衷方案是返回高度0.5,导致导航栏下方的线条稍微粗一些。但是,如果有人知道如何完全隐藏第一部分标题,我将不胜感激。
更新
根据caglar的分析(https://stackoverflow.com/a/19056823/413337),只有在表视图包含在导航控制器中时才会出现问题。
答案 0 :(得分:140)
我有一个似乎相当干净的解决方法。所以我在回答我自己的问题。
由于第一节标题的高度不起作用0,我返回1.然后我使用 contentInset 隐藏导航栏下方的高度。
<强>目标-C:强>
- (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);
}
<强>夫特:强>
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return section == 0 ? 1.0 : 32
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.contentInset = UIEdgeInsets(top: -1, left: 0, bottom: 0, right: 0)
}
答案 1 :(得分:36)
答案对我和我的团队来说非常有趣,并且像魅力一样工作
<强>原因:强>
我们观察到这只发生在视图层次结构中的第一个视图,如果第一个视图是UITableView 。所以,除了第一个,所有其他类似的UITableViews都没有这个烦人的部分。我们尝试将UITableView移出视图层次结构中的第一个位置,一切都按预期工作。
答案 2 :(得分:23)
将此技巧用于分组类型tableView
在 viewDidLoad 方法中为表格视图的代码复制粘贴:
tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tableView.bounds.size.width, 0.01f)];
答案 3 :(得分:18)
这种方式还可以。
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 {
...
}
}
答案 4 :(得分:6)
我刚刚复制了你的代码并试过了。它运行正常(在模拟器中试用)。我附上了结果视图。你想要这样的观点吧?或者我误解了你的问题?
答案 5 :(得分:5)
Swift3:heightForHeaderInSection与0一起使用,你只需要确保标题设置为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
}
答案 6 :(得分:5)
更新[9/19/17]:旧答案在iOS 11中不再对我有用。感谢Apple。以下是:
/final
上一个答案:
正如Chris Ostomo的评论中所述,以下内容对我有用:
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 20.0f;
self.tableView.contentInset = UIEdgeInsetsMake(-18.0, 0.0f, 0.0f, 0.0);
答案 7 :(得分:1)
以下是在Swift中如何删除已分组的UITableView中顶部标题的方法:
tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNormalMagnitude))
答案 8 :(得分:1)
在Swift 4.2和许多早期版本中,不必像其他答案中那样将第一个标头的高度设置为0,而是可以将其他标头设置为nil
。假设您有两个部分,并且只希望第二个部分(即1
)具有标题。该标题将带有文本 Foobar :
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return section == 1 ? "Foobar" : nil
}
答案 9 :(得分:0)
我无法发表评论,但我想补充一点,如果您的控制器上有一个void PathInit(Path *P, int vsize){
P = (Path *)malloc(sizeof(Path)); /* Remove this line */
UISearchController
作为UISearchBar
,请将第一部分的高度设置为tableHeaderView
中的0确实有用。
我使用heightForHeaderInSection
,以便默认隐藏搜索栏。
结果是第一部分没有标题,向下滚动会在第一行的正上方显示搜索栏。
答案 10 :(得分:0)
最简单的方法是在def digit_sum(n):
s=0
while(n>0):
r=n%10
n=n/10
s=s+r
return s
print digit_sum(0123)
中为nil
返回您不希望显示标题的部分。
答案 11 :(得分:0)
如果要完全删除所有节标题,请尝试此操作
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
答案 12 :(得分:0)
Swift版本:Swift 5.1
通常,您可以像这样在tableView委托中设置高度:
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
return UIView(frame: CGRect(x: 0, y: 0, width: view.width, height: CGFloat.leastNormalMagnitude))
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
有时,当您使用Xib或Storyboard创建UITableView时,up的答案不起作用。您可以尝试第二种解决方案:
let headerView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNormalMagnitude))
self.tableView.tableHeaderView = headerView
希望它对您有用!
答案 13 :(得分:0)
以下内容适用于我在iOS 13.6和Xcode 11.6中使用的UITableViewController
嵌入UINavigationController
中的情况:
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
nil
}
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
.zero
}
无需其他技巧。当不使用override
时(即刚实现UITableViewController
方法时,不需要UITableViewDelegate
关键字)。当然,如果目标是仅隐藏第一部分的标题,那么可以将此逻辑包装在这样的条件中:
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
if section == 0 {
return nil
} else {
// Return some other view...
}
}
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if section == 0 {
return .zero
} else {
// Return some other height...
}
}