我有一个scrollview和一个单独的UIView,我在其中放置了一系列textFields和带有约束的标签,这些约束完全占据了顶部和底部。我试图根据其子视图约束来调整UIView的高度,但事实并非如此。发生的事情是视图保持其高度并迫使其他文本字段崩溃或缩小,从而打破约束。
-(void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
/* I had to adjust the UIView's width to fill the entire self.view.*/
if(![contentView isDescendantOfView:detailsScrollView]){
CGRect r = contentView.frame;
r.size.width = self.view.frame.size.width;
contentView.frame = r;
[detailsScrollView addSubview:contentView];
}
}
视图
这是目前发生的事情。在这种情况下,它会强制电子邮件字段缩小。如果我在其上放置一个高度值,它不会缩小,但布局引擎会找到另一个要破坏的元素
编辑:
也许我只是需要一些休息来梳洗一下。我之前尝试过使用约束但没有运气。然而,由于这个建议,我回去设置约束,而不是在这个上设置框架,并让它最终工作。
-(void)viewDidLoad{
[detailsScrollView addSubview:contentView];
[contentView setTranslatesAutoresizingMaskIntoConstraints:NO];
[detailsScrollView setTranslatesAutoresizingMaskIntoConstraints:NO];
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(contentView,detailsScrollView);
NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[contentView]-0-|"
options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil
views:viewsDictionary];
NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[contentView]-0-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:viewsDictionary];
NSArray *widthConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[contentView(==detailsScrollView)]-0-|" options:0 metrics:nil views:viewsDictionary];
}
答案 0 :(得分:1)
使用界面构建器处理UIScrollView
及其子UIView
时。通常在UIScrollView
及其子项之间设置top,bottom,left和equal width约束,在您的情况下为contentView
。
没有这些约束,另一个选项是设置UIScrollView的内容大小。这是在引入约束之前使用UIScrollView的方式。
所以,1。你应该以编程方式添加这些约束。
通过使用约束,不再需要视图框来调整视图大小。
所以,2。删除内容视图的框架设置。
我对你在viewDidLayoutMethod中设置框架的方式不太满意。如果我要在这里做,我会从if statement
。
代码如下:no if statement:
[detailsScrollView addSubview:contentView];
// then set the constraints here after adding the subview.
将此代码放在viewDidLayoutSubviews方法的任何位置,但不在其中。如果在语句中设置框架,那将是一个更大的问题。
注意:最初,如果要在viewDidLayoutSubviews中设置框架 方法。你应该为所有情况做这件事。例如,对于if情况 和其他情况。因为,下次这个方法将会是 调用视图将响应约束。失去了它的框架。
另一个观察结果:如果您希望视图响应其子视图约束,为什么需要为其设置框架?正确?
添加约束后,您可能需要调用方法constraintNeedsUpdate
或其他相关方法。