以编程方式为 UITableView 和 UISearchBar 设置 NSLayoutConstraints

Posted

技术标签:

【中文标题】以编程方式为 UITableView 和 UISearchBar 设置 NSLayoutConstraints【英文标题】:Programmatically setting NSLayoutConstraints for UITableView and UISearchBar 【发布时间】:2013-12-12 15:02:55 【问题描述】:

我有一个UIViewController,它确实在它的-viewDidLoad 方法中添加了一个UISearchBar 和一个UITableView,作为它的view 属性的子视图。添加这些之后,我使用如下可视格式语言创建约束:

NSDictionary *views = @@"searchBar": [_searchController searchBar],
                        @"dataTable": [self tableView];

NSArray *horizontalSearchBarConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[searchBar]|"
                                                                                  options:0
                                                                                  metrics:nil
                                                                                    views:views];
NSArray *horizontalDataTableConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[dataTable]|"
                                                                                  options:0
                                                                                  metrics:nil
                                                                                    views:views];
NSArray *verticalSearchBarDataTableConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[searchBar(44)][dataTable]|"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:views];
NSMutableArray *allConstraints = [NSMutableArray new];
[allConstraints addObjectsFromArray:horizontalDataTableConstraints];
[allConstraints addObjectsFromArray:horizontalSearchBarConstraints];
[allConstraints addObjectsFromArray:verticalSearchBarDataTableConstraints];

[[self view] addConstraints:allConstraints];

阅读:宽度应该是整个屏幕的宽度,searchBar 的高度应该正好是 44,dataTable 的高度应该从searchBar 的底部延伸到视图的底部.

在此之前,我将这些视图的 translatesAutoresizingMaskIntoConstraints 设置为 NOUIViewController 本身以模态视图呈现。我们说的是 ios 6。

我得到的是:一个空的视图。就是纯白。

我错过了什么?我还是 Auto Layout 的新手,并尝试围绕它进行思考。

谢谢!

更新:添加整个-viewDidLoad

- (void)viewDidLoad 
    [super viewDidLoad];    
    BOOL translatesAutoreszingMaskIntoConstraints = NO;

    [[self view] setTranslatesAutoresizingMaskIntoConstraints:translatesAutoreszingMaskIntoConstraints];

    // manually create the search bar
    UISearchBar *searchBar = [[UISearchBar alloc] init];
    [searchBar setDelegate:self];
    [searchBar setShowsCancelButton:NO];
    [searchBar setTranslatesAutoresizingMaskIntoConstraints:translatesAutoreszingMaskIntoConstraints];

    // create the search bar controller
    _searchController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
    [_searchController setDelegate:self];
    [[_searchController searchResultsTableView] setDelegate:self];
    [_searchController setSearchResultsDataSource:self];
    [_searchController setSearchResultsDelegate:self];

    // add the search bar
    [[self view] addSubview:[_searchController searchBar]];

    // manually create the table view and add it to the view
    _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
    [_tableView setBackgroundView:nil];
    [_tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLineEtched];
    [_tableView setSeparatorColor:NEA_COLOR_MEDIUM_GREY];
    [_tableView setBackgroundColor:NEA_COLOR_VIEW_BACKGROUND];
    [_tableView setDataSource:self];
    [_tableView setDelegate:self];
    [_tableView setTranslatesAutoresizingMaskIntoConstraints:translatesAutoreszingMaskIntoConstraints];

    [[self view] addSubview:[self tableView]];

    // set up the layout using Auto Layout
    NSDictionary *views = @@"searchBar": [_searchController searchBar],
                            @"dataTable": [self tableView];

    NSArray *horizontalSearchBarConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[searchBar]|"
                                                                                      options:0
                                                                                      metrics:nil
                                                                                        views:views];
    NSArray *horizontalDataTableConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[dataTable]|"
                                                                                      options:0
                                                                                      metrics:nil
                                                                                        views:views];
    NSArray *verticalSearchBarDataTableConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[searchBar(44)][dataTable]|"
                                                                                             options:0
                                                                                             metrics:nil
                                                                                               views:views];

    NSMutableArray *allConstraints = [NSMutableArray new];
    [allConstraints addObjectsFromArray:horizontalDataTableConstraints];
    [allConstraints addObjectsFromArray:horizontalSearchBarConstraints];
    [allConstraints addObjectsFromArray:verticalSearchBarDataTableConstraints];

    [[self view] addConstraints:allConstraints];

    // add our little gradient
    UIImage *shadow = [UIImage imageNamed:@"searchbar_bg_shadow"];
    UIImageView *shadowView = [[UIImageView alloc] initWithImage:shadow];
    [shadowView setFrame:CGRectMake(0, 44, 900, 14)];
    [shadowView setBackgroundColor:[UIColor clearColor]];
    [shadowView setTranslatesAutoresizingMaskIntoConstraints:YES];
    [[self view] addSubview:shadowView];

    // add the cancel button for the search bar
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"ui_navigationbar_close"] style:UIBarButtonItemStyleBordered target:self action:@selector(cancel:)];
    [[self navigationItem] setRightBarButtonItem:cancelButton];

    // set a short back button title
    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStyleBordered target:nil action:nil];
    self.navigationItem.backBarButtonItem = backButton;

更新:附加信息

封装UINavigationController 是通过情节提要创建的。在那里,将UIViewController 添加到我的班级,因为它是rootViewController。就是这样。

当我在该格式字符串中手动添加宽度时,它会显示视图。因此,当我手动指定尺寸时,它可以工作。但是,我想,我可以简单地使用框架来代替......

【问题讨论】:

你添加[[self view] addSubview:[_searchController searchBar]];[[self view] addSubview:[self tableView]];?控制台有错误吗? 是的,我是这样添加的,但不,不幸的是,我在控制台上没有任何错误。 我需要更多信息,你能分享你的代码吗? 没问题,更新了问题。 很奇怪,但你的代码对我来说是正确的。 MB你可以分享所有的项目吗?还是测试? 【参考方案1】:

我不知道您的问题是否已解决,但我注意到您的代码中存在潜在问题。

试着去掉下面这行代码:

[[self view] setTranslatesAutoresizingMaskIntoConstraints:translatesAutoreszingMaskIntoConstraints];

对于根视图,不要将该属性设置为 NO。

【讨论】:

天哪……非常感谢。就是这样。

以上是关于以编程方式为 UITableView 和 UISearchBar 设置 NSLayoutConstraints的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建 UITableView

如何以编程方式在 UITableView 中添加视图?

以编程方式编辑 UITableView 在所有行上显示删除按钮

UITableView:以编程方式滚动内容视图

UITableView 单元格中的 UITextField 以编程方式成为FirstResponder

如何以编程方式设置 UITableView 标头的约束以支持 RTL 和 LTR?