为uiview设置编程约束以支持纵向/横向

时间:2016-09-19 10:13:31

标签: ios objective-c uiinterfaceorientation landscape-portrait nsautolayout

enter image description here我已将自己的自定义uiview添加到self.view中。由于我们无法在此场景中设置故事板中的约束,因此我尝试以编程方式添加。

关注此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,但我仍然在观看半视角。

对此有任何想法。提前致谢。

3 个答案:

答案 0 :(得分: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);}];

这将为您的视图设置顶部,右侧,底部和左侧约束。

答案 1 :(得分:0)

尝试willRotateToInterfaceOrientation:duration:调用setNeedsUpdateConstraints来查看是否需要更新其约束。

除非未通知视图,否则不会更新约束

答案 2 :(得分:0)

我正确设置了约束,当用户更改方向时,视图将根据它们调整大小。 如果您向我们展示您的代码,我们将更容易为您提供帮助。

一些提示:

  • 务必将translatesAutoresizingMaskIntoConstraints属性设置为NO
  • 您可以使用可视化格式设置约束,有时更容易忘记一个:Visual Format Language
  • 检查日志以查看约束是否未被破坏

如果正确设置了约束,则应根据超视图框架调整视图大小。

<强>更新

我看到两种可能性:要么没有真正设置约束(因为视图没有准备好),要么一个约束或更多约束被破坏(但在这种情况下你应该看到一些日志)。

我给你一些适合我的代码(我个人在可能的情况下使用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];:系统自行更新子视图的约束。