2016-05-22 3 views
2

Я пытаюсь добавить два UIView на ViewController. Один из них - простой UIView, а другой - UITableView. Я не совсем уверен, как установить ограничение по высоте на них таким образом, что UITableView будет иметь высоту, необходимую для его содержимого, а другое представление может изменить размер на основе высоты UITableView.Задание автоматических ограничений компоновки программно на двух представлениях в ViewController

Ниже приведен простой эскиз и код, который я использую для настройки этих ограничений.

enter image description here

NSDictionary *views = NSDictionaryOfVariableBindings(_infoView,_infoTableView); 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[_infoView]" 
                    options:0 
                    metrics:nil 
                    views:views]]; 

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_infoView]-[_infoTableView]" 
                    options:0 
                    metrics:nil 
                    views:views]]; 

// Width constraint 
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.infoView 
               attribute:NSLayoutAttributeWidth 
               relatedBy:NSLayoutRelationEqual 
                toItem:self.view 
               attribute:NSLayoutAttributeWidth 
               multiplier:1.0 
                constant:0]]; 

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.infoTableView 
                 attribute:NSLayoutAttributeWidth 
                 relatedBy:NSLayoutRelationEqual 
                 toItem:self.view 
                 attribute:NSLayoutAttributeWidth 
                multiplier:1.0 
                 constant:0]]; 

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.infoView 
                 attribute:NSLayoutAttributeTop 
                 relatedBy:NSLayoutRelationEqual 
                 toItem:self.view 
                 attribute:NSLayoutAttributeTop 
                multiplier:1.0 
                 constant:0]]; 

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.infoTableView 
                 attribute:NSLayoutAttributeBottom 
                 relatedBy:NSLayoutRelationEqual 
                 toItem:self.view 
                 attribute:NSLayoutAttributeBottom 
                multiplier:1.0 
                 constant:0]]; 

Любые комментарии/обратная связь будет высоко оценен. Спасибо.

+0

Вы можете нарисовать эскиз или н, чтобы показать нам, как именно вы хотите, чтобы они выглядели? – ozgur

+0

ozgur - добавлен эскиз. – slonkar

ответ

2

Вы на правильном пути. Хитрость здесь в том, что вам нужно динамически обновлять высоту tableView на его contentSize.height так infoView будет знать, что должно быть либо растянуто по вертикали или сжато:

Сначала нужно определить свойство, которое будет содержать ограничение высоты:

@property (nonatomic, strong) NSLayoutConstraint *tableViewHeightConstraint; 

- (void)viewDidLoad { 
    ... 
    self.tableViewHeightConstraint = [NSLayoutConstraint constraintWithItem:self.tableView 
                   attribute:NSLayoutAttributeHeight 
                   relatedBy:NSLayoutRelationEqual 
                    toItem:nil 
                   attribute:NSLayoutAttributeNotAnAttribute 
                   multiplier:0.0 
                   constant:350.0]; 
} 

Тогда вы можете обновить ограничение высоты сразу после Tableview знает его contentSize (например: viewDidAppear:animated):

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    self.tableViewHeightConstraint.constant = self.tableView.contentSize.height; 
    [self.view layoutIfNeeded]; 
} 

Я создал a sample project для вас, чтобы вы могли поиграть с ним, чтобы лучше понять, что я намереваюсь сделать.

enter image description here

+0

Большое спасибо за объяснение и образец приложения. Моя проблема была решена путем добавления нового heightConstraint, как вы предложили. Если вы посмотрите на образец кода, я также заметил, что вы не используете ограничения ширины/ограничения сверху вниз. Есть ли какая-то конкретная причина для этого? Потому что, когда я изменил свой код на эти минимальные ограничения, оба вида исчезли. – slonkar

+1

Обратите внимание на '|', когда я определяю вертикальные ограничения, такие как: 'V: | [infoView] - [tableView] |'. Это гарантирует, что подпункты будут сдерживать верх и низ супервизора. То же самое относится к горизонтальным ограничениям, таким как 'H: | [infoView] |', где ведущие и конечные данные infoView ограничены, поэтому вам не нужно устанавливать ограничение ширины. – ozgur

+0

О, я пропустил это. Благодаря !!! – slonkar

Смежные вопросы