简体   繁体   English

自动版式:无法同时满足约束

[英]Autolayout: Unable to simultaneously satisfy constraints

I'm trying to stack multiple views in a container view using autolayout and the following code: 我正在尝试使用自动布局和以下代码在容器视图中堆叠多个视图:

UIView* prevView = commentBox; // Set the prev view to the container
for(Comment* comment in [[post info] comments]){
    UIView* commentView = [[UIView alloc] initWithFrame:CGRectZero];
    [commentView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [commentBox addSubview:commentView];

    // Vertically align with container view
    [commentBox addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[commentView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(commentView)]];

    // Add a space of 8 between the previous view and the current view
    [commentBox addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[prevView]-8-[commentView(==100)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(prevView, commentView)]];

    // Store the current view for the next round
    prevView = commentView;
}
// Finally, add a space between the last element and the container view
[commentBox addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[prevView]-8-[commentBox]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(prevView, commentBox)]];

The commentBox itself is autolayouted in the storyboard, which should be safe. commentBox本身是自动放置在情节提要中的,这应该是安全的。

However, when the commentBox gets filled with the subviews, it shows me the following error: 但是,当commentBox充满子视图时,它将显示以下错误:

Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this: (1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x170097ca0 H:|-(0)-[UIView:0x170199e60]   (Names: '|':UIView:0x17019a8f0 )>",
    "<NSLayoutConstraint:0x170097cf0 H:[UIView:0x170199e60]-(0)-|   (Names: '|':UIView:0x17019a8f0 )>",
    "<NSLayoutConstraint:0x174099280 UIView:0x17419c8a0.width == UIView:0x17019a8f0.width>",
    "<NSLayoutConstraint:0x17409a180 'UIView-Encapsulated-Layout-Width' H:[UIView:0x17419c8a0(320)]>",
    "<NSLayoutConstraint:0x170098ec0 H:[UIView:0x170199e60]-(8)-[UIView:0x1701997e0]>",
    "<NSLayoutConstraint:0x170098f10 H:[UIView:0x1701997e0(100)]>",
    "<NSLayoutConstraint:0x170099050 H:[UIView:0x1701997e0]-(8)-[UIView:0x170199a50]>",
    "<NSLayoutConstraint:0x1700990a0 H:[UIView:0x170199a50(100)]>",
    "<NSLayoutConstraint:0x170099190 H:[UIView:0x170199a50]-(8)-[UIView:0x17019b110]>",
    "<NSLayoutConstraint:0x1700991e0 H:[UIView:0x17019b110(100)]>",
    "<NSLayoutConstraint:0x174099dc0 H:[UIView:0x17019b110]-(8)-[UIView:0x170199e60]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x174099dc0 H:[UIView:0x17019b110]-(8)-[UIView:0x170199e60]>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

I don't have any clue how to fix that. 我不知道如何解决这个问题。

I'm using xCode 6.1 with iOS SDK 8.1 我将xCode 6.1与iOS SDK 8.1一起使用

Thank you in advance 先感谢您

I see two things wrong in your code. 我发现您的代码中有两件事是错误的。 First, you can't refer to the superview with [prevView] where you make your first horizontal constraint, or [commentBox] in the last constraint. 首先,您不能在第一个水平约束或最后一个约束的[commentBox]中引用带有[prevView]的超级视图。 You need to refer to it with the pipe character, "|". 您需要使用竖线字符“ |”来引用它。 Secondly, you can't make hard constraints (by that I mean sizes and spaces with fixed values) all the way across the view (unless those numbers all exactly add up to the width of the superview, and even then you shouldn't do it). 其次,您不能对整个视图进行严格的约束(即我的意思是具有固定值的大小和空间)(除非这些数字完全正好等于超级视图的宽度,即使如此,您也不应这样做)它)。 So, you either need to allow the widths or spacing to be flexible, or don't make that last constraint to the right side of commentView. 因此,您要么需要允许宽度或间距灵活,要么不要将最后一个约束置于commentView的右侧。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM