Ограничения автоматического макета не соблюдаются

Я программно создаю ограничения, чтобы представление контроллера представления имело фоновое представление и панель инструментов с панелью инструментов внизу. Я хочу, чтобы высота фонового изображения уменьшалась по мере увеличения высоты панели инструментов. После добавления фонового представления и панели инструментов в качестве подпредставлений к представлению контроллера представления я вызываю (в viewDidLoad) следующий метод, который программно устанавливает ограничения.

- (void)configureConstraintsForBackgroundViewAndToolbar {

    [self.backgroundView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [self.toolbarComponent setTranslatesAutoresizingMaskIntoConstraints:NO];

    UIView *constraintsBackgroundView = self.backgroundView;
    UIView *constraintsToolbar = self.toolbarComponent;

    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(
                                    constraintsBackgroundView, 
                                    constraintsToolbar);
    NSDictionary *metricsDictionary = @{
                                        @"toolbarHeight":[NSNumber numberWithFloat:TOOLBAR_HEIGHT]
                                        };

    [NSLayoutConstraint activateConstraints:
            [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(0)-[constraintsBackgroundView]-(0)-|" 
            options:NSLayoutFormatDirectionLeadingToTrailing 
            metrics:metricsDictionary 
            views:viewsDictionary]];

    [NSLayoutConstraint activateConstraints:
            [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(0)-[constraintsToolbar]-(0)-|" 
            options:NSLayoutFormatDirectionLeadingToTrailing 
            metrics:metricsDictionary 
            views:viewsDictionary]];

    [NSLayoutConstraint activateConstraints:
            [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(0)-[constraintsBackgroundView]-(0)-[constraintsToolbar(>=toolbarHeight)]-(0)-|" 
            options:NSLayoutFormatDirectionLeadingToTrailing 
            metrics:metricsDictionary 
            views:viewsDictionary]];
}

Это отлично работает до тех пор, пока я не попытаюсь обновить высоту панели инструментов, используя следующий метод (через встроенное текстовое представление). Что-то не так, что я здесь делаю? Высота панели инструментов увеличивается, но фоновое представление не уменьшается по высоте (я отлаживаю это с помощью SparkInspector). Кажется довольно простым, что здесь не хватает чего-то очевидного...

- (void)textViewDidChange:(UITextView *)textView {

    if (textView != self.toolbarTextView) {
        return;
    }

    CGFloat currentHeight = self.bounds.size.height;

    CGSize size = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, textView.frame.size.height)];
    CGFloat determinedHeight = fminf(fmaxf(size.height, TOOLBAR_HEIGHT), MAX_TOOLBAR_HEIGHT);

    [self setBounds:CGRectMake(0, 0, self.bounds.size.width, determinedHeight)];    

    [self setNeedsLayout];
}

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

Большое спасибо...


person vikram17000    schedule 19.09.2016    source источник


Ответы (1)


Если вы настраиваете свой макет с ограничениями, нет смысла устанавливать границы или рамки для ваших представлений для обновления макета. Вместо этого добавьте ограничения таким образом, чтобы вы могли редактировать свой макет, изменив свойство constant ограничения.

Например:

Установите высоту панели инструментов, используя определенное ограничение, и сохраните ее в свойстве.

NSLayoutConstraint *toolBarHeightConstraint = [NSLayoutConstraint constraintWithItem:constraintsToolbar
                                                                           attribute:NSLayoutAttributeHeight
                                                                           relatedBy:NSLayoutRelationEqual
                                                                              toItem:self.view
                                                                           attribute:NSLayoutAttributeNotAnAttribute
                                                                          multiplier:1
                                                                            constant:TOOLBAR_HEIGHT];

Затем измените высоту панели инструментов, изменив константу ограничения. как:

toolBarHeightConstraint.constant = newHeight;

В вашем случае вам также нужно будет изменить вертикальное ограничение на:

[NSLayoutConstraint activateConstraints:
            [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(0)-[constraintsBackgroundView]-(0)-[constraintsToolbar]-(0)-|" 
            options:NSLayoutFormatDirectionLeadingToTrailing 
            metrics:metricsDictionary 
            views:viewsDictionary]];

Дополнительные сведения см. в этом ответе.

person Ishan Handa    schedule 20.09.2016
comment
Спасибо @Ishan Handa ... это имеет смысл ... Я могу исправить это, используя ваши предложения ... еще раз большое спасибо ... - person vikram17000; 20.09.2016