Установите программно ограничения для uiview, чтобы поддержать как портрет / пейзаж

Я добавил свой собственный пользовательский интерфейс в self.view. Поскольку в этом сценарии мы не можем устанавливать ограничения в раскадровке, я попытался добавить программно.

После этого Как создать ограничения макета программно.

Я использую приведенный ниже код.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];

    [customView setNeedsUpdateConstraints];
}

-(void)updateViewConstraints
{
    UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);

[self.view addConstraints:@[

                            //view1 constraints
                            [NSLayoutConstraint constraintWithItem:customView
                                                         attribute:NSLayoutAttributeTop
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:self.view
                                                         attribute:NSLayoutAttributeTop
                                                        multiplier:1.0
                                                          constant:padding.top],

                            [NSLayoutConstraint constraintWithItem:customView
                                                         attribute:NSLayoutAttributeLeft
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:self.view
                                                         attribute:NSLayoutAttributeLeft
                                                        multiplier:1.0
                                                          constant:padding.left],

                            [NSLayoutConstraint constraintWithItem:customView
                                                         attribute:NSLayoutAttributeBottom
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:self.view
                                                         attribute:NSLayoutAttributeBottom
                                                        multiplier:1.0
                                                          constant:-padding.bottom],

                            [NSLayoutConstraint constraintWithItem:customView
                                                         attribute:NSLayoutAttributeRight
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:self.view
                                                         attribute:NSLayoutAttributeRight
                                                        multiplier:1
                                                          constant:-padding.right],

                            ]];


}

я звоню [self updateViewConstraints] от viewDidLoad, но все же я получаю половину зрения в ландшафте.

Любая идея по этому поводу. Заранее спасибо.

3 ответа

Вы можете использовать масонство для этих целей. Как пример:

UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(superview.mas_top).with.offset(padding.top); //with is an optional semantic filler
make.left.equalTo(superview.mas_left).with.offset(padding.left);
make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom);
make.right.equalTo(superview.mas_right).with.offset(-padding.right);}];

Это установит верхний, правый, нижний и левый ограничения для вашего просмотра.

Попробуйте в willRotateToInterfaceOrientation:duration:вызов setNeedsUpdateConstraints чтобы посмотреть, что нужно обновить свои ограничения.

Если представление не уведомлено, оно не будет обновлять ограничения

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

Некоторые намеки:

  • Обязательно установите translatesAutoresizingMaskIntoConstraints собственность на NO
  • Вы можете использовать визуальный формат, чтобы установить свои ограничения, иногда проще не забыть один: Visual Format Language
  • Проверьте свои журналы, чтобы увидеть, не нарушено ли ограничение

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

ОБНОВИТЬ

Я вижу две возможности: либо ограничения на самом деле не установлены (потому что представление, например, не подготовлено), либо одно ограничение или более нарушено (но в этом случае вы должны увидеть некоторые журналы).

Я даю вам код, который работает для меня (я лично использую визуальный формат для ограничений, когда это возможно):

customView = [UIView new];
customView.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:customView];

UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);

NSDictionary *views = @{ @"customView" : customView };
NSDictionary *metrics = @{ @"top" : @(padding.top) , @"bottom" : @(padding.bottom) , @"right" : @(padding.right) , @"left" : @(padding.left) };
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-left-[customView]-right-|" options:0 metrics:nil views:views]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-top-[customView]-bottom-|" options:0 metrics:nil views:views]];

Я не использую метод [customView setNeedsUpdateConstraints]; когда произошло ротация: система сама обновляет ограничения подпредставлений.

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