【问题标题】:UISearchBar moves down 20 pixelsUISearchBar 向下移动 20 像素
【发布时间】:2014-02-19 22:29:17
【问题描述】:

我有一个UITableViewController T,它以标准方式包含UISearchDisplayControllerUISearchBar(所有内容都在笔尖中定义)。然后 T 被其他视图控制器以标准方式包含为子视图控制器。

搜索栏正确显示:

但是当我点击搜索栏进行实际搜索时,搜索栏变高了,搜索栏内的内容下降了大约 20 像素(呃,状态栏的高度?巧合?)像这样:

那是怎么回事?它太高了。此外,使它看起来像那样的动画也很笨拙。有什么方法可以防止这种难看的增长?

【问题讨论】:

  • 我在UISearchController 遇到了这个问题,你记得你是否/如何解决它吗?

标签: ios uisearchbar uisearchdisplaycontroller


【解决方案1】:

我设法通过以编程方式设置UISearchController 来解决与您遇到的问题非常相似的问题,如下所示:

注意~如果 hidesNavigationBarDuringPresentation 没有设置为 NO,错误仍然存​​在。

#pragma mark - View Life Cycle

- (void)viewDidLoad {
    [super viewDidLoad];

    self.results = [[NSArray alloc] init];

//  1  \\ Results Table View
    UITableView *searchResultsTableView = [[UITableView alloc] initWithFrame:self.tableView.frame];
    [searchResultsTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:Identifier];
    searchResultsTableView.delegate = self;
    searchResultsTableView.dataSource = self;

//  2  \\ init search results table view & setting its table view
    self.searchResultsTableViewController = [[UITableViewController alloc] init];
    self.searchResultsTableViewController.tableView = searchResultsTableView;
    self.searchResultsTableViewController.view.backgroundColor = [UIColor blackColor];

//  3  \\ init a search controller with it's tableview controller for results
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchResultsTableViewController];
    self.searchController.hidesNavigationBarDuringPresentation = NO;    //  √
    self.searchController.searchResultsUpdater = self;
    self.searchController.delegate = self;
    self.searchController.searchBar.barTintColor = [UIColor blackColor];

//  4  \\ Make an appropriate search bar (size, color, attributes) and add it as the header
    [self.searchController.searchBar sizeToFit];
    self.tableView.tableHeaderView = self.searchController.searchBar;
    self.tableView.tableHeaderView.backgroundColor = [UIColor blackColor];

//  5  \\ Enable presentation context
    self.definesPresentationContext = YES;
    self.tableView.backgroundColor = [UIColor clearColor];
    self.currentUser = [PFUser currentUser];
}

添加了更多详细信息:

  1. 界面生成器:UIViewController(不是 UITableViewController)
  2. 添加带有约束的UITableView

    一个。

    b. *我的导航栏是自定义高度 - 您的“顶部空间至:顶部布局指南”可能会更改

  3. Delegate & Data Source 从添加的 Table View 添加到 UIViewController

    一个。不要忘记以编程方式这样做:

    @interface AddUsersViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
    
    @property (weak, nonatomic) IBOutlet UITableView *tableView;
    
  4. 在您的接口扩展中:

    一个。设置UISearchConroller 的代表和数据源:

    #import "AddUsersViewController.h"
    
    #define ResultsTableView self.searchResultsTableViewController.tableView
    #define Identifier @"Cell"
    
    @interface AddUsersViewController () <UISearchControllerDelegate, UISearchResultsUpdating>
    
    @property (nonatomic) UISearchController *searchController;
    @property (nonatomic) UITableViewController *searchResultsTableViewController;
    @property (nonatomic, weak) UIBarButtonItem *leftBarButton;
    @property (nonatomic) NSArray *results;
    
    @end
    

虽然这对我有用,但我发现还有其他可能的情况会导致这种情况。我的“问题”不是搜索栏向下移动了 20 像素(左右),而是向上移动了。我将此归因于自定义 UINavigationBar 标头,其中包括图像标题和自定义 NavBarButtons。考虑到这一点,这里还有两个可能的解决方案:

原始场景:

  1. 您的容器视图的 extendedLayoutIncludesOpaqueBars 属性

    一个。 情节提要检查 √“在不透明条下”查看情节提要中的表格视图。

    b. 以编程方式yourTableView(s).extendedLayoutIncludesOpaqueBars = YES;

.

  1. scopeButtonTitles 设置为空数组。 (下)

    self.searchController = UISearchController(searchResultsController: nil);
    self.searchController.searchResultsUpdater = self;
    self.searchController.searchBar.scopeButtonTitles = [];
    self.tableView.tableHeaderView = self.searchController.searchBar;
    

后两个答案来自THIS 问题,也可能证明对结帐有益。

感谢 BananaNeil 的研究和测试,他发现如果您遵循我的建议并设置您的 searchController.searchBar.y = 0,您的搜索栏应该正是您希望的位置。 √

【讨论】:

  • 感谢您为此答案付出的所有努力。我正在研究您的解决方案,并且肯定会越来越近,但仍然存在问题。如果我能让它为我工作,我会将它标记为已接受。
  • 您使用的是UISearchDisplayController 还是UISearchController?前者在 iOS 8 中已被弃用,可能是问题的根本原因。
  • @BananaNeil 我已经添加了我在最初提供的 viewDidLoad: 方法之外实现的代码/工作。
  • 设置searchController = hidesNavigationBarDuringPresentation = false 确实将问题更改为与您发布的第二个链接完全相同,但实施他们的解决方案并没有解决我的问题。相反,结果是 searchBar NEEDEDy 值为0。它的超级视图可以定位在任何位置,但是如果 searchBar 的 y 位置不是 0,则此错误仍然存​​在。
  • @ChrisHaze 非常感谢您的辛勤工作!
【解决方案2】:

不确定这是否是 iOS 9 特有的,但设置

searchController.hidesNavigationBarDuringPresentation = NO;

解决了 UISearchBar 在整个包含 UITableView 的奇怪向下移动的问题。当然,这确实禁用了导航栏 - 所以这可能不是你想要的。

【讨论】:

    【解决方案3】:

    我实际上已经弄清楚了我的问题:

    我将UISearchBar 放在一个包装视图中,当UITableView 滚动时我正在重新定位它。

    包装器20px 比搜索栏高,我设置了searchbar.y = 20(出于文体原因)。每次点击搜索栏,莫名的增长了20px。

    在某个时候,我设置了searchBar.y = 10,并注意到它只增长了10px

    果然,结果是 searchBar 的增长高度正好等于它在其直接超级视图中的 y 位置。因此,当我设置searchbar.y = 0 时,搜索栏停止增长。

    【讨论】:

      【解决方案4】:

      不要使用 UITableViewController,而是选择一个普通的 UIViewController 并将 UITableView 添加到它的视图中。添加约束以将其固定到Top Layout Guide.BottomSuperview.LeadingSuperview.TrailingBottom Layout Guide.Top。然后将Search Bar 添加到 UITableView。

      由于某种原因,以这种方式实现时搜索栏不会跳转。

      一个可能的原因可能是在编辑搜索控制器时通过偏移顶部布局指南的高度来调整搜索栏的位置。将 Table View 顶部显式固定到 Top Layout Guide.Bottom 会有所帮助。

      希望这会有所帮助!

      【讨论】:

      • 我很确定搜索显示控制器已被弃用。
      • 已弃用。但由于最初的问题提到了它,我继续采用这种方法。
      • 但是即使使用 UISearchController,这个解决方案也应该适用于您。
      【解决方案5】:

      请尝试使用:

      yourSearchBar.clipsToBounds = true
      

      【讨论】:

        【解决方案6】:

        Swift 5.x 解决方案:

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

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

        在 swift 的低版本中,用法类似于以下:

         self.edgesForExtendedLayout = .None
         self.edgesForExtendedLayout = UIRectEdgeNone
        

        【讨论】:

          猜你喜欢
          • 2011-01-18
          • 2012-01-06
          • 2011-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多