【问题标题】:UISearchBar automatically resizes and changes frameUISearchBar 自动调整大小和改变框架
【发布时间】:2014-01-07 13:44:15
【问题描述】:

我遇到了一个搜索栏问题,当它变成 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;
}

正常状态

当搜索栏变成firstResponder 时,它要么向上移动一个点,要么随机向下移动一个点



并且当搜索栏退出时,它会向上移动以到达窗口原点,然后返回其自然框架

这里有一个sample project 重现了这个错误。

编辑:

根据@kwylezsuggestion,可以通过以下方式避免搜索栏在退出时制作的不需要的动画:

self.searchBar.clipsToBounds = YES;

【问题讨论】:

  • 添加您的搜索栏作为 viewcontroller 视图的子视图,而不是作为 tableView 的 tableHeader 修复向上/向下运动,如果它不必是 tableHeader。
  • 是的,但我在表格视图后面有内容需要在用户滚动时显示...如果我没有找到任何东西,我可能会退回到解决方案。
  • 试试这个 self.searchBar.showsCancelButton = NO;[self.searchBar sizeToFit];

标签: ios uisearchbar uisearchdisplaycontroller


【解决方案1】:

我通过创建一个带有 ClipBounds 设置为 YES 的 UIView 解决了这个问题,然后在其中添加子视图的搜索栏。 然后将其包含在 tableview 标题中。它现在可以工作了。

谢谢

【讨论】:

    【解决方案2】:

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

    自定义您的搜索栏视图

    Fixed - UISearchBar-bug-master

    【讨论】:

    • 你只是改变了颜色(我希望我没有遗漏什么)在输入之前间隙仍然显示表格视图的背景(每 2 次)
    • 搜索显示控制器将搜索界面叠加在原始视图控制器的视图上。阅读苹果文档
    • 我知道,但它不应该留下那个空白。它不在 iOS 6 中。UISearchDisplayController 在 iOS 7 中有许多错误,但需要使用它。我正在寻找一种解决方案来改变这种情况下的行为。我很感激你的努力,并且非常乐意接受一个答案(甚至奖励另一个赏金,因为这个问题已经结束了),但在这种情况下,说明问题出在哪里并不能解决它。
    【解决方案3】:

    我将问题追溯到 JASidePanelController 中的函数“_layoutSidePanels”。

    在您的应用委托中,我注释掉了以下代码,它似乎修复了灰色视图的增长和缩小。

    rootViewController.shouldResizeLeftPanel = YES;
    

    如果您遵循代码,请在选择搜索栏时,您调用SetCenterPanelhidden,随后调用_LayoutSidePanel,该代码:

    if (self.leftPanel.isViewLoaded) {
        CGRect frame = self.leftPanelContainer.bounds;
        if (self.shouldResizeLeftPanel) {
            frame.size.width = self.leftVisibleWidth;
        }
        self.leftPanel.view.frame = frame;
    }
    

    更改侧面板的框架似乎是原因,正如我所说,将代码注释掉解决了我的问题。

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

    编辑#2:花了我一段时间,但我设法弄清楚那个灰色面具是从哪里来的。您的 UISearchDisplayController 是造成搜索栏成为第一响应者时出现的灰色背景的原因,当我删除以下两行代码时,您看到的问题就消失了:

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

    这样做只是为了说明问题的原因,但删除这些代码行会禁用您将从使用搜索显示控制器中获得的任何功能。我不知道你到底希望做什么,所以我真的不能给你任何关于如何进行的建议,但希望我已经为你指出了正确的方向!

    【讨论】:

    • 您所说的问题肯定是UISearchDisplayController,即使在Apple的示例代码中也存在此错误。与 JASidePanels 的动画“冲突”通过裁剪到边界来解决。
    • 如果我的回答有帮助,我们将不胜感激! :)
    • 您的答案是指出问题所在,但没有解决问题。在你回答之前,我有剪辑到边界的解决方案(检查我的编辑)。如果您更改它并解决问题,我会非常乐意批准您的:)
    • 如果问题,如您所说,是 iOS 错误而不是您的代码错误,我认为您要么必须忍受它,直到苹果修复它,要么摆脱UISearchDisplayController 并实现您自己的搜索栏功能。
    猜你喜欢
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多