【问题标题】:UISearchBar moves when manipulating the text field操作文本字段时 UISearchBar 移动
【发布时间】:2016-09-15 04:24:00
【问题描述】:

我遇到了一个令人头疼的问题。

在 Interface Builder 中,我有一个仅包含一个 tableview 的场景。这个子类 UITableViewController 的控制器。我有另一个场景,顶部有一个高度为 50 的视图,跨越视图的宽度。下面是一个容器视图,最终包含一个列表或地图。控制器是 UIViewController 的子类。这是它在模拟器上的样子...

请注意,您在上图中看到的列表是完全不同的表和视图控制器。搜索栏控制器用于按城市或 zip 搜索位置。搜索栏控制器的表格视图覆盖了另一个列表。当从搜索表中选择一个位置时,该位置的区域将被提供给另一个控制器,该控制器使用私有 Web 服务来检索兴趣点列表。

我正在调用以下方法将搜索栏添加到上述视图中。

- (void)setupSearchView {
    self.searchTableViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"LocationSearchTable"];
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchTableViewController];
    self.searchController.searchResultsUpdater = self.searchTableViewController;
    [self.searchController.searchBar sizeToFit];
    self.searchController.searchBar.tag = 9189;
    self.searchController.searchBar.placeholder = @"Search by city or ZIP code";
    [self.searchView addSubview:self.searchController.searchBar];
    [[self.searchView viewWithTag:9189] becomeFirstResponder];
    self.searchController.hidesNavigationBarDuringPresentation = false;
    self.searchController.dimsBackgroundDuringPresentation = true;
    self.definesPresentationContext = true;
}

当我在文本字段中单击并将 self.definesPresentationContext 设置为 true 时,搜索栏会下降到导航栏的确切高度,并在其上方留下一个大的空白区域。

如果 self.definesPresentationContext 为 false,则行为和结果不同。在这种情况下,当我单击搜索字段时,一切看起来都很好。但是当我开始键入时,导航控制器就被白色覆盖了。搜索栏不会改变位置。如果我使用 Reveal,我可以看到导航栏已被推回堆栈中。这就是它的样子......

我错过了什么?

【问题讨论】:

  • 仔细看... 表格背景总是比表格的其他图层高 64 像素。
  • 你是怎么解决这个问题的?

标签: ios objective-c uisearchbar uisearchcontroller


【解决方案1】:

我遇到了同样的问题,尝试在当前视图控制器的 viewDidLoad 中使用以下代码行。

  self.extendedLayoutIncludesOpaqueBars = true

【讨论】:

    【解决方案2】:

    Swift 5.x 解决方案:

    edgesForExtendedLayout 设置为 none 或 empty 将解决此问题。

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        self.edgesForExtendedLayout = []
    }
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。在屏幕上的每次更改中添加一个搜索栏及其框架,使其不会下降。这段代码应该有助于解决问题:

      override func viewWillLayoutSubviews() {
          super.viewWillLayoutSubviews()
          self.searchController.searchBar.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: 50)
          self.view.addSubview(searchController.searchBar)
      }
      

      并在这里使用viewDidLoad:

      self.extendedLayoutIncludesOpaqueBars = true

      【讨论】:

        猜你喜欢
        • 2012-11-30
        • 1970-01-01
        • 1970-01-01
        • 2010-10-08
        • 2020-01-02
        • 1970-01-01
        • 1970-01-01
        • 2017-07-28
        • 2013-03-06
        相关资源
        最近更新 更多