Программная установка NSLayoutConstraints для UITableView и UISearchBar

У меня есть UIViewController это добавляет UISearchBar и UITableView в это -viewDidLoad метод как подпредставление это 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 за эти взгляды на NO, UIViewController сам представлен в модальном представлении. Мы говорим об 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, Это все.

Когда я вручную добавляю ширину в эту строку формата, он отображает виды. Поэтому, когда я вручную указываю размеры, это работает. Но тогда, я думаю, я мог бы просто использовать кадры вместо...

1 ответ

Решение

Я не знаю, была ли ваша проблема решена или нет, но я заметил потенциальную проблему в вашем коде.

Попробуйте удалить следующую строку кода:

[[self view] setTranslatesAutoresizingMaskIntoConstraints:translatesAutoreszingMaskIntoConstraints];

Не устанавливайте это свойство в NO для корневого представления.

Другие вопросы по тегам