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