2014-02-19 117 views
13

我有一个UITableViewController T,其中包含标准方式的UISearchDisplayControllerUISearchBar(在nib中定义的所有内容)。然后T被其他视图控制器以标准方式包含在子视图控制器中。UISearchBar向下移动20个像素

搜索栏显示正确:

normal search bar

但是,当我点击搜索栏中的确需要搜索,搜索栏变得更高,和搜索栏里面的内容由什么样子滴下来约20像素(呃,状态栏巧合的高度?)像这样:

weird search bar is too tall

什么与怎么了?它太高了。此外,使它看起来像这样的动画是不明智的。任何方法来防止这种难看的增长?

+1

我在这个问题'UISearchController'你还记得,如果/您是如何解决的呢? – AnthonyM

回答

7

我设法解决一个非常类似的问题给你通过编程设置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

    b。 *我的导航栏是定制的高度 - 你的“顶层空间到:顶面布置指南”可以改变

  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 
    

虽然这个工作对我来说,我已经发现,有可能会造成这个其他可能出现的情况。我的“问题”并不是搜索栏向下移动了20px(或左右),而是移动了。我将其归因于包含图像标题和自定义NavBarButtons的自定义UINavigationBar标题。考虑到这一点,这里有两种可能的解决方案:

原方案:

  1. 你的容器视图的extendedLayoutIncludesOpaqueBars物业

    一个。 故事板检查√在故事板中的表视图“不透明酒吧”下。

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

  • 设置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,那么您的搜索栏应该完全位于您期望的位置。 √

    +0

    感谢您为此付出的所有努力。我正在解决您的解决方案,并且一定会越来越近,但仍然存在问题。如果我能为它工作,我会将其标记为已接受。 – BananaNeil

    +0

    你在使用'UISearchDisplayController'还是'UISearchController'?前者在iOS 8中被弃用,可能是问题的根源。 – ChrisHaze

    +0

    @BananaNeil我已经添加了我刚刚提供的'viewDidLoad:'方法之外实现的代码/工作。 – ChrisHaze

    0

    而不是使用UITableViewController,选择一个正常的UIViewController,并添加一个UITableView到它的视图。添加约束将其固定到Top Layout Guide.BottomSuperview.LeadingSuperview.Trailing,Bottom Layout Guide.Top。然后将Search Bar添加到UITableView。

    由于某些原因,搜索栏在执行时不会跳转。

    一个可能的原因可能是编辑搜索控制器时,通过偏移顶部布局指南的高度来调整搜索栏的位置。明确固定桌面视图顶部到Top Layout Guide.Bottom有助于某种方式。

    希望这会有所帮助!

    +0

    我很确定搜索显示控制器已被弃用。 – BananaNeil

    +0

    已弃用。但是由于原来的问题提到它,我继续采用这种方法。 –

    +0

    但是,即使使用UISearchController,此解决方案也适用于您。 –

    1

    其实我已经想通了,我的问题:

    我有我的UISearchBar内部的包装来看,这点我是重新定位为滚动的UITableView

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

    在某一点上,我设置了searchBar.y = 10,并注意到它仅增长了10px

    果然,事实证明searchBar的增长高度与其立即超级检视中的y位置完全相同。所以,当我设置searchbar.y = 0时,搜索栏停止增长。

    6

    不知道这是iOS的9个特定,但设置

    searchController.hidesNavigationBarDuringPresentation = NO;

    解决所有在包含UITableViewUISearchBar的怪异向下运动的问题。当然,这确实禁用导航栏 - 所以这可能不是你想要的。