在 iOS7 中使用 UISearchBar 将子视图添加到 tableHeaderView 行为不端

Posted

技术标签:

【中文标题】在 iOS7 中使用 UISearchBar 将子视图添加到 tableHeaderView 行为不端【英文标题】:Adding subviews to tableHeaderView with UISearchBar in iOS7 misbehaves 【发布时间】:2014-01-15 17:41:26 【问题描述】:

如何在一个 TableHeaderView 中添加两个简单的 UILabel 并保留 ios7 中搜索显示控制器的默认搜索栏行为?

或者,视觉上:

为什么会有这段代码:

UIView *tableHeadView = self.tableView.tableHeaderView;   

UILabel *tableHeaderLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 36, 320, 30)];
[tableHeaderLabel setTextAlignment:NSTextAlignmentCenter];
tableHeaderLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:18];
tableHeaderLabel.text = @"Questions"

UILabel *tableHeaderPrononce = [[UILabel alloc] initWithFrame:CGRectMake(0, 50, 320, 30)];
[tableHeaderPrononce setTextAlignment:NSTextAlignmentCenter];
tableHeaderPrononce.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:15];
tableHeaderPrononce.text = @"test test test test";

[tableHeadView addSubview:tableHeaderLabel];
[tableHeadView addSubview:tableHeaderPrononce];

添加到 UITableViewController viewDidLoad 事件(其中包含 UISearchDisplayerController) 在 iOS6 中给出了这个可爱的结果: 而在 iOS7 中这个可怕的可怕结果:

行为: 在正常模式下,我添加的 UILabel 不会显示。当搜索处于活动状态时,UILabels 突然出现在表格单元格的顶部并且不会滚动

此外,我在 iOS 7 中搜索时遇到了崩溃,这在 iOS6 上从未发生过。可能与这段代码无关,但我应该提到这一点。

我尽我所能找到解决此问题的方法,但总是有其他东西中断或消失(主要是 UISearchBar)。

帮助

【问题讨论】:

如果有任何方法可以链接到 github 上的项目,我会为你看看这两个问题。 它不在 git 上,但所有相关代码都在这里 【参考方案1】:

看,伙计,在你修改代码或对 iOS7 的行为感到沮丧之前,建议通过苹果提供的UI Transition Guide。

读完这篇你就会知道,为什么分组样式的tableView看起来很烦人,从ios7的角度来看一点也不烦人。 每个组都扩展了屏幕的整个宽度。

此外,如果您通读Search Bar and Scope Bar,则可以控制UISearchBar 的行为

我希望这会有所帮助。如果您需要所有代码,请告诉我们。我们可以提供样品。

这是所需的示例代码将 UISearchBar 添加到 View 而不是 TableViewHeader

UISearchBar 添加到self.view

searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0f,0.0f, 320, 44.0f)];
searchBar.delegate         = self;
searchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth;
searchBar.searchBarStyle = UISearchBarStyleMinimal;
[self.view addSubview:searchBar];

UITableView 添加到self.view

tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 44, self.view.bounds.size.width, self.view.bounds.size.height) style:UITableViewStylePlain];
tableView.delegate         = self;
tableView.dataSource       = self;
tableView.backgroundColor = [UIColor clearColor];
tableView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
[self.view addSubview:tableView];

创建和添加UITableView.tableHeaderView

UILabel *tableHeaderLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 15)];
[tableHeaderLabel setTextAlignment:NSTextAlignmentCenter];
tableHeaderLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:18];
tableHeaderLabel.text = @"Questions";
tableHeaderLabel.alpha = 0.9;

UILabel *tableHeaderPrononce = [[UILabel alloc] initWithFrame:CGRectMake(0, 14, 320, 15)];
[tableHeaderPrononce setTextAlignment:NSTextAlignmentCenter];
tableHeaderPrononce.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:15];
tableHeaderPrononce.text = @"test test test test";
tableHeaderPrononce.alpha = 0.7;

UIView *aHeaderView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 30)];
[aHeaderView setBackgroundColor:[UIColor clearColor]];
[aHeaderView addSubview:tableHeaderLabel];
[aHeaderView addSubview:tableHeaderPrononce];
tableView.tableHeaderView = aHeaderView;

结果如下:

搜索显示控制器

// Create search controller
searchController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
searchController.searchResultsDataSource = self;
searchController.searchResultsDelegate   = self;
searchController.delegate                = self;

【讨论】:

看来您更需要代码。过段时间我会给你代码。谢谢。 看看我的编辑。如果您希望将 UISearchBar 添加为 tableHeaderView 的一部分,我将添加更多代码。 好的,非常感谢!事情是你已经创建了一个独立的 UISearchBar,我的链接到 UISearchDisplayController。此外,它已经出现在 TableViewHeader 上,以防我没有添加那 2 个 UILabel .. 不,它链接到 UISearchDisplayController。由于不需要显示该代码,因此我在这里没有提及。 请期待我的回复会有所延迟,因为我是通过互联网访问最少的移动设备进行的。 :-(【参考方案2】:

您可以通过如下所示的 UITableViewDelegate 方法简单地做到这一点:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

    UIView *sectionHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 40)];
    sectionHeaderView.backgroundColor = [UIColor grayColor];
    UILabel *headerLabel = [[UILabel alloc] init];
    [sectionHeaderView addSubview:headerLabel];

    return sectionHeaderView;

【讨论】:

以上是关于在 iOS7 中使用 UISearchBar 将子视图添加到 tableHeaderView 行为不端的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS7 中更改 UISearchBar 的 inputView?

如何在 iOS7 中右对齐 UISearchbar 的文本

如何在iOS7中更改UISearchBar的取消按钮的textColor?

在 iOS7 中移除 UISearchBar 的边框

UISearchBar 搜索图标在 iOS7 中没有左对齐

UISearchBar 自定义代码在 iOS7 中崩溃,适用于 iOS6