UISearchBar向下移动20个像素

时间:2014-02-19 22:29:17

标签: ios uisearchbar uisearchdisplaycontroller

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

搜索栏正确显示:

normal search bar

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

weird search bar is too tall

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

6 个答案:

答案 0 :(得分:8)

我设法通过以编程方式设置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. Interface Builder :UIViewController(不是UITableViewController)
  2. 添加带有约束的UITableView

    一个。 enter image description here

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

  3. 添加代表&从添加的表视图到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
    
  5. 虽然这对我有用,但我发现还有其他可能造成这种情况的情况。我的“问题”并不是搜索栏向下移动了20px(左右),而是向上移动了。我把它归因于一个自定义的UINavigationBar头,其中包括一个图像标题和自定义的NavBarButtons。考虑到这一点,这里有两个可能的解决方案:

    原始场景:

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

      一个。 故事板检查√“在不透明栏下”了解故事板中的表格视图。

      以编程方式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;
        
      2. 后两个答案来自THIS问题,并且可能证明在退房时也是有益的。

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

答案 1 :(得分:6)

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

searchController.hidesNavigationBarDuringPresentation = NO;

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

答案 2 :(得分:1)

我实际上已经弄明白了我的问题:

我在包装器视图中有UISearchBar,我在滚动UITableView时重新定位。

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

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

可以肯定的是,事实证明,searchBar的增长高度恰好等于它在其直接超视图中的y位置。因此,当我设置searchbar.y = 0时,搜索栏就会停止增长。

答案 3 :(得分:0)

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

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

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

希望这有帮助!

答案 4 :(得分:0)

请尝试使用:

yourSearchBar.clipsToBounds = true

答案 5 :(得分:0)

Swift 5.x解决方案:

edgesForExtendedLayout 设置为无或为空将解决此问题。

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

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

 self.edgesForExtendedLayout = .None
 self.edgesForExtendedLayout = UIRectEdgeNone