0

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

Следящий за этим How to Create layout constraints programmatically.

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

- (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, но до сих пор я получаю половину вид на пейзаж.

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

+0

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

+0

@Lefteris Я добавил ссылку, которая использовала те же ограничения. –

ответ

0

Для этих целей вы можете использовать Masonry. Например:

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);}]; 

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

+0

спасибо за ответ. Я последовал за вами, но вы все равно получаете половину экрана после поворота. Я добавил этот код в viewDidLoad. Нужно ли добавлять какие-либо? –

+0

@SteveGear попробуйте добавить его в viewDidAppear, потому что в viewDidLoad views супервизор не настроен – ko7tya

+0

Не работает ko7tya..uploaded image plz check –

0

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

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

0

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

Некоторые советы:

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

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

UPDATE

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

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

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];, когда произошел поворот: система обновляет ограничения подвыборы сами по себе.

+0

Еще один возможный raisons: убедитесь, что ваше представление было добавлено до того, как вы установили ограничения. Более того, в документации говорится, что мы используем метод '[NSLayoutConstraint activateConstraints:]' вместо '[view addConstraints:]': [Apple doc] (https://developer.apple.com/reference/uikit/uiview/ 1622513-addconstraints? Language = objc) –

+0

оба такие же @Olivier –

+0

спасибо за код. Но все равно я получаю полуэкран после ротации. :( –

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

  • Нет связанных вопросов^_^