以编程方式为搜索栏和UITableView使用AutoLayout

时间:2015-11-21 11:31:41

标签: ios uitableview autolayout ios9 uisearchcontroller

我的容器视图几乎全屏没有状态栏。

然后我创建了一个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]];

我需要将搜索栏范围选项和表格视图一起正确滑动。这是如何以编程方式完成的?

3 个答案:

答案 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]];

首先,如您所见,您不需要使用视图创建单独的字典,但您可以使用一个(更简单的恕我直言)

其次约束如下:

  1. @"H:|[searchBar]|" - >搜索栏固定在左侧&具有系统默认(8px)边距的containerView右侧
  2. @"H:|[tableView]|" - > tableView固定在左侧&具有系统默认(8px)边距的containerView右侧
  3. @"V:|[searchBar(44)][tableView]|" - >

    • 搜索栏固定在带有默认边距的containerView顶部,固定高度为44像素
    • tableView top固定在searchBar的底部,没有任何边距
    • tableView的底部固定在containerView的底部

答案 2 :(得分:-1)

您希望将UITableView的顶部附加到顶部布局指南的底部。

顶级布局指南仅在您使用 Storyboard 时可用。

使用Interface Builder的另一个原因。

原因编号1 =您首先不会遇到此错误,您可以直观地显示您的约束,并且您可以通过完整的0行代码实现所有这些。

我绝对相信,通过SO社区的努力和支持,您可以在代码中完成所有工作。我发现 IB 不仅可以节省设计时间,还可以减少调试到操作系统,并确保任何应用程序的使用寿命更长。 故事板可让您专注于使您的应用与我的应用不同的原因,而不是痛苦地克服布局故障。