我已将自己的自定义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
,但我仍然在观看半视角。
对此有任何想法。提前致谢。
答案 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作为约束):
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];
:系统自行更新子视图的约束。