UISearchBar会自动调整大小和更改框架。

11

当搜索栏成为firstResponder并释放时,它会以奇怪的方式表现,我遇到了这个问题。

搜索栏被添加为表视图的标题。

self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.view.frame.size.width, 44.0f)];
self.searchBar.translucent = NO;
self.searchBar.barTintColor = [UIColor grayColor];
self.tableView.tableHeaderView = self.searchBar;

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar
                                                          contentsController:self];
self.searchController.searchResultsDataSource = self;

视图控制器设置在JASidePanelController的左侧面板,当键盘显示或隐藏时,它会隐藏中心面板:

- (void)keyboardWillAppear:(NSNotification *)note
{
    [self.sidePanelController setCenterPanelHidden:YES
                                          animated:YES
                                          duration:[[note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    self.searchBar.showsCancelButton = YES;
}

- (void)keyboardWillDisappear:(NSNotification *)note
{
    [self.sidePanelController setCenterPanelHidden:NO
                                          animated:YES
                                          duration:[[note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    self.searchBar.showsCancelButton = NO;
}

正常状态 Normal state

当搜索栏成为firstResponder时,它会随机向上或向下移动一个点。

Point up Point down



当搜索栏取消第一响应者时,它会动画地上移到窗口原点,然后回到其自然框架。

Stretching up

Reaching origin

这里是一个样例项目来重现这个bug。

编辑:

根据@kwylez建议,可以通过以下方式避免搜索栏在取消第一响应者时产生的不必要动画:

self.searchBar.clipsToBounds = YES;

将搜索栏作为视图控制器视图的子视图添加,而不是作为tableView的tableHeader,可以修复上下移动问题,如果它不必是tableHeader。 - Joseph Chen
这是正确的,但我有一些内容在表视图后面,需要在用户滚动时显示... 如果我找不到任何解决方案,我可能会退回到这个解决方案。 - Moxy
尝试这个:self.searchBar.showsCancelButton = NO; [self.searchBar sizeToFit]; - Chamira Fernando
3个回答

8
我通过创建一个ClipBounds设置为YES的UIView,并在其中添加子视图搜索栏来解决了这个问题。然后将其包含在表格视图头部中。现在它可以工作了。
谢谢。

0
您可以使用搜索栏和视图控制器初始化搜索显示控制器,以便管理要搜索的数据。当用户开始搜索时,搜索显示控制器会将搜索界面叠加在原始视图控制器的视图上,并在其表格视图中显示搜索结果。
自定义您的搜索栏视图

Fixed - UISearchBar-bug-master


你只改变了颜色(希望我没有漏掉什么),但是间隙仍然显示表视图的背景(每两次中有一次)在输入之前。 - Moxy
搜索显示控制器将搜索界面叠加在原始视图控制器的视图上。请阅读苹果文档。 - codercat
1
我知道,但它不应该留下那个间隙。在iOS 6中没有这种情况。UISearchDisplayController在iOS 7中有很多bug,但是我们仍需要使用它。我正在寻找一种解决方案来改变它在这种情况下的行为。我非常感谢你的努力,并且很乐意接受答案(甚至会奖励额外的赏金,因为这个问题已经快要结束了),但在这种情况下,指出问题所在并不能解决它。 - Moxy

-1
我将问题追溯到JASidePanelController中的函数“_layoutSidePanels”。
在您的应用程序委托中,我注释掉了以下代码,这似乎修复了灰色视图的增长和收缩。
rootViewController.shouldResizeLeftPanel = YES;

如果您跟隨代碼進行操作,當搜索欄被選擇時將調用setCenterPanelHidden,該函數隨後會調用_layoutSidePanels,最終執行以下代碼:
if (self.leftPanel.isViewLoaded) {
    CGRect frame = self.leftPanelContainer.bounds;
    if (self.shouldResizeLeftPanel) {
        frame.size.width = self.leftVisibleWidth;
    }
    self.leftPanel.view.frame = frame;
}

似乎是更改侧边栏的框架导致了问题,正如我所说,注释掉该代码可以解决我的问题。

编辑:起初似乎搜索栏上下移动了一点,但经过进一步检查,它似乎总是略微低于导航栏,但直到您选择搜索栏并且视图的其余部分“变灰”,您才会注意到它,因此在蓝色导航栏和浅灰色搜索栏之间的那个小空间就像下面的表格视图一样变成了深灰色。

编辑#2:花了我一段时间,但我设法找出那个灰色遮罩来自哪里。您的UISearchDisplayController负责出现搜索栏成为第一响应者时的灰色背景,当我删除以下两行代码时,您看到的问题消失了:

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
self.searchController.searchResultsDataSource = self;

这样做只是为了演示问题的原因,但是删除那些代码行将禁用您使用搜索显示控制器获得的任何功能。我不知道您希望做什么,所以无法给出关于如何继续的建议,但希望我已经指出了问题的根源!


1
你所说的问题明显是UISearchDisplayController存在的bug,即使在苹果的示例代码中也有这个问题。通过剪裁边界来解决与JASidePanels的动画“冲突”。 - Moxy
如果我的回答有所帮助,批准它将不胜感激! :) - Mike
你的回答指出了问题所在,但并没有解决它。在你回答之前,我已经有了剪裁边界的解决方案(请查看我的编辑)。如果你改变了你的回答并解决了问题,我会非常乐意批准它 :) - Moxy
1
如果问题确实是iOS的bug而不是你的代码问题,我认为你要么得忍受它直到苹果修复它,要么就放弃UISearchDisplayController并实现自己的搜索栏功能。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接