我的容器视图几乎全屏没有状态栏。
然后我创建了一个UISearchController和一个UITableView。我正在使用ios 9并以编程方式执行操作。我遇到的错误是触摸搜索栏时,范围选项在其下方打开,但是tableview没有正确向下滑动。我该如何解决这个问题?
我的viewDidLoad中的代码是:
// Search controller
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.searchController.dimsBackgroundDuringPresentation = NO;
self.searchController.searchBar.scopeButtonTitles = @[@"A", @"B", @"C"];
self.searchController.searchBar.delegate = self;
[self.searchController.searchBar setTranslatesAutoresizingMaskIntoConstraints:NO];
// UITableView
self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
self.tableView.translatesAutoresizingMaskIntoConstraints = NO;
// Container view is defined as the whole screen except 20 points at the top where the status bar is
[containerView addSubview:self.searchController.searchBar];
[containerView addSubview:self.tableView];
// The constraints - something is probably wrong here?
// Search bar constraints
NSDictionary *views2 = @{@"searchBar": self.searchController.searchBar};
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[searchBar]|" options:0 metrics:nil views:views2]];
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[searchBar]|" options:0 metrics:nil views:views2]];
// Tableview constraints
NSDictionary *views = @{@"tableView": self.tableView};
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tableView]|" options:0 metrics:nil views:views]];
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[tableView]|" options:0 metrics:nil views:views]];
我需要将搜索栏范围选项和表格视图一起正确滑动。这是如何以编程方式完成的?
答案 0 :(得分:1)
您不仅可以从top layout guide
(Storyboard / xib)添加Interface Builder
约束,还可以通过编程方式添加。{/ p>
您是否曾尝试使用KVConstraintExtensionsMaster库来应用我已实施的约束。使用此库,您可以通过编程方式添加top and bottom layout guide
约束以及更多不可能或非常困难的故事板或xib。
将以下代码放在viewDidLoad中:
// create containerView
containerView = [UIView prepareNewViewForAutoLayout];
[containerView setBackgroundColor:[UIColor brownColor]];
[self.view addSubview:containerView];
// create Search controller
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.searchController.dimsBackgroundDuringPresentation = NO;
self.searchController.searchBar.delegate = self;
self.searchController.searchBar.scopeButtonTitles = @[@"A", @"B", @"C"];
// create UITableView
self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
[_tableView setBackgroundColor:[UIColor blueColor]];
[self.tableView prepareViewForAutoLayout];
[containerView addSubview:self.searchController.searchBar];
[containerView addSubview:self.tableView];
// now applying the constraints by using KVConstraintExtensionsMaster library
// adding leading and trailing contraints of containerView
[containerView applyLeadingAndTrailingPinConstraintToSuperviewWithPadding:defualtConstant];
// adding Top and Bottom Layout Guidecontraint of containerView
[self applyTopLayoutGuideConastrainToView:containerView withPadding:defualtConstant];
[self applyBottomLayoutGuideConastrainToView:containerView withPadding:defualtConstant];
// adding Top constraint of searchBar
[self.searchController.searchBar applyTopPinConstraintToSuperviewWithPadding:defualtConstant];
// adding leading and trailing contraints of searchBar
[self.searchController.searchBar applyLeadingAndTrailingPinConstraintToSuperviewWithPadding:defualtConstant];
// adding leading and trailing contraints of tableView
[self.tableView applyLeadingAndTrailingPinConstraintToSuperviewWithPadding:defualtConstant];
// adding Bottom constraint of tableView
[self.tableView applyBottomPinConstraintToSuperviewWithPadding:defualtConstant];
// adding vertical constraint between two Sibling views
// to increase the vertical space between searchBar & tableView, update the spacing value like 10.0 or what you want
[self.searchController.searchBar applyConstraintFromSiblingViewAttribute:NSLayoutAttributeBottom toAttribute:NSLayoutAttributeTop ofView:self.tableView spacing:defualtConstant];
答案 1 :(得分:0)
那么约束肯定是错误的
他们应该是这样的:
NSDictionary *views = @{@"tableView": self.tableView,@"searchBar": self.searchController.searchBar};
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[searchBar]|" options:0 metrics:nil views:views]];
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tableView]|" options:0 metrics:nil views:views]];
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[searchBar(44)][tableView]|" options:0 metrics:nil views:views]];
首先,如您所见,您不需要使用视图创建单独的字典,但您可以使用一个(更简单的恕我直言)
其次约束如下:
@"H:|[searchBar]|"
- >搜索栏固定在左侧&具有系统默认(8px)边距的containerView右侧@"H:|[tableView]|"
- > tableView固定在左侧&具有系统默认(8px)边距的containerView右侧 @"V:|[searchBar(44)][tableView]|"
- >
答案 2 :(得分:-1)
您希望将UITableView
的顶部附加到顶部布局指南的底部。
顶级布局指南仅在您使用 Storyboard 时可用。
使用Interface Builder的另一个原因。
原因编号1 =您首先不会遇到此错误,您可以直观地显示您的约束,并且您可以通过完整的0行代码实现所有这些。
我绝对相信,通过SO社区的努力和支持,您可以在代码中完成所有工作。我发现 IB 不仅可以节省设计时间,还可以减少调试到操作系统,并确保任何应用程序的使用寿命更长。 故事板可让您专注于使您的应用与我的应用不同的原因,而不是痛苦地克服布局故障。