我有一个UITableViewController
T,它以标准方式包含UISearchDisplayController
和UISearchBar
(在nib中定义的所有内容)。然后由某个其他视图控制器以标准方式将T包含为子视图控制器。
搜索栏正确显示:
但是当我点击搜索栏进行实际搜索时,搜索栏会变得更高,搜索栏内的内容会下降大约20像素(呃,状态栏的高度?巧合?)像这样:
这是怎么回事?太高了。此外,使它看起来像这样的动画是笨拙的。有什么方法可以防止这种难看的增长?
答案 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];
}
添加带有约束的UITableView
:
湾 *我的导航栏是自定义高度 - 您的“顶级空间:顶部布局指南”可能会更改
添加代表&从添加的表视图到UIViewController的数据源出口
一个。不要忘记以编程方式这样做:
@interface AddUsersViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITableView *tableView;
在接口扩展程序:
中一个。设置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(左右),而是向上移动了。我把它归因于一个自定义的UINavigationBar头,其中包括一个图像标题和自定义的NavBarButtons。考虑到这一点,这里有两个可能的解决方案:
。
您的容器视图的 extendedLayoutIncludesOpaqueBars
属性
一个。 故事板:检查√“在不透明栏下”了解故事板中的表格视图。
湾以编程方式: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
你的搜索栏应该正是你希望它的位置。 √
答案 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.Bottom
,Superview.Leading
,Superview.Trailing
,Bottom 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