UISearchBar 在向下滚动之前不可见

Posted

技术标签:

【中文标题】UISearchBar 在向下滚动之前不可见【英文标题】:UISearchBar not visible until scroll down 【发布时间】:2015-01-24 14:34:23 【问题描述】:

我以编程方式向 tableHeaderView 添加了 UISearchBar,但它没有在视图加载时显示。 我的表格内容上方只有一个空白区域。当我向下滚动一点时,它会出现。 我更改了 tableHeaderView 的背景颜色以查看它是否完全可见 - 我可以看到更改后的颜色,因此 searchBar 本身似乎是不可见的。 有什么想法吗?

这是我的代码:

- (void)viewDidLoad

[super viewDidLoad];
...
// Initialize the refresh control.
[self.refreshControl addTarget:self
                        action:@selector(refreshData)
              forControlEvents:UIControlEventValueChanged];
// Suchelemente erzeugen
self.searchBar = [UISearchBar new];
self.searchDC = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
self.searchDC.searchResultsDelegate = self;
self.searchDC.delegate = self;
self.searchDC.searchResultsDataSource = self;
self.tableView.tableHeaderView = self.searchBar;
// some attempts to make it visible
self.searchBar.hidden = NO;
self.searchBar.layer.hidden = NO;
[self.searchBar sizeToFit];

好的,发现是刷新控件导致了问题。 在 viewWillAppear 中调用了一个方法来更新刷新控件的标题。当我评论这一行时,会出现搜索栏:

self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:title];

那么,如何让它们都工作呢?

【问题讨论】:

您是在 tableview 标题中添加其他内容还是将其 contentOffset 设置为某些内容? 我为表格视图控制器的 refreshControl 属性分配了一个刷新控件。不知道是不是也放在tableview header中? 你在使用故事板吗? 是的,但不是搜索栏或刷新控件。 【参考方案1】:

你可以设置:

self.navigationItem.hidesSearchBarWhenScrolling = NO;

【讨论】:

【参考方案2】:

创建一个刷新控件并将其设置为tableview的刷新控件。这样self.refreshcontrol的属性文本就没有设置了。

UIRefreshControl *refresh = [[UIRefreshControl alloc] init];
refresh.attributedTitle = [[NSAttributedString alloc] initWithString:GetLocalizedString(@"REFRESH_TO_RELEASE_TITLE", nil)];
[refresh addTarget:self action:@selector(refreshViewPulled:) forControlEvents:UIControlEventValueChanged];
self.refreshControl=refresh;

【讨论】:

请使用 4 个空格而不是反引号来格式化您的代码块。 不错。我直接设置 self.refreshControl 并首先创建一个局部变量然后设置它工作。不太清楚为什么它仍然没有给出自我版本的属性文本,但是嘿,它有效!【参考方案3】:

我遇到了同样的问题。我通过务实地调整内容偏移来修复它,以便触发橡皮筋滚动动画,导致 UISearchBar 重新出现。

如果不可见,试试这个:

[self.tableView setContentOffset:CGPointMake(0, -1) animated:NO]; 

【讨论】:

【参考方案4】:

问题是因为您尝试将 2 个东西添加到同一个位置,因为您从未真正为任何一个指定框架,即使 UIResultsController 知道它的去向,它可以更改,并且 UIControlEventValueChanged [向下拖动] 可能是造成帧变化的差异。所以我建议通过情节提要来实现你的搜索栏,因为你说你正在使用它。将 Search Display Controller 拖放到 Navigation Bar 下方但 Table View 上方,您会看到光标变为绿色加号,这意味着您可以将其拖放到那里(在本例中是 tableViewHeader):

然后你应该能够继续务实地改变 UIRefreshControl 正常

-(void)viewDidLoad 
    self.refreshControl = [[UIRefreshControl alloc] init];
    self.refreshControl.backgroundColor = [UIColor clearColor];
    self.refreshControl.tintColor = [UIColor purpleColor];
    [self.refreshControl addTarget:self
                        action:@selector(refreshView:)
              forControlEvents:UIControlEventValueChanged]
    self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull down to Refresh.."];

现在添加到同一位置的两个项目应该不会有冲突的框架更改。

【讨论】:

感谢您提供详细的提示。试过了,但没有任何改变。我的下一次尝试也是将 IB 用于 refreshControl,但这意味着在我的项目中进行很多更改,因为它尚未在我的 tableViewController 的超类中定义 - 也许这就是问题... @Markus 你不必在 IB 中创建 UIRefreshControl

以上是关于UISearchBar 在向下滚动之前不可见的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C - 滚动时 UISearchController 结果在 UISearchBar 上重叠

如何防止行动画向下滚动 TableHeaderView?

保持 uisearchbar 在 uitableview 中始终可见

无法使用机器人框架向下滚动网页

在键盘打开时将项目添加到 RecyclerView 时向下滚动

UIWebView 和 UISearchBar 用于搜索