简体   繁体   中英

Swift - constraints - dynamic label width

I have three buttons in one "line".

A - B --- C

I have programatically added these constraints:

A has constraints:

leading to superview (value = 16)
width (value = 49)
height (value = 40)
trailing to B (value = 16)
top to top layout guide (value = 16)

B has constraints:

width (value = 49)
height (value = 40)
top to top layout guide (value = 16)

C has constraints:

trailing to superview (value = 16)
height (value = 40)
top to top layout guide (value = 16)
leading to B (value >= 20)

Now leading to B in C cause error if I run app and complains on "Unable to simultaneously satisfy constraints."

I thought that this is caused by "missing" content (it is added later in runtime) of C label and therefore unknown width.

I have tried manually to add for C:

width (value = 20) 

The "error" still remains, but this should fulfill the condition for leading to B >= 20.

However, If I run app, even though the error is printed, the UI looks correct. What is the problem / solution for this?

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) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x1c4098ab0 h=--& v=--& UIView:topView.width == 0   (active)>",
    "<NSLayoutConstraint:0x1c4092480 H:[UIView:parentParent]-(0)-|   (active, names: '|':UIView:topView )>",
    "<NSLayoutConstraint:0x1c40924d0 UIVIew:topView.leading == UIView:parentParent.leading   (active)>",
    "<NSLayoutConstraint:0x1c0094140 H:|-(0)-[UIView:parent](LTR)   (active, names: '|':UIView:parentParent )>",
    "<NSLayoutConstraint:0x1c00940a0 UIView:parent.right == UIView:parentParent.right   (active)>",
    "<NSLayoutConstraint:0x1c0094000 H:|-(16)-[UIButton:A]   (active, names: '|':UIView:parent )>",
    "<NSLayoutConstraint:0x1c0093f60 UIButton:A.trailing == UIButton:B.leading - 16   (active)>",
    "<NSLayoutConstraint:0x1c0094730 H:[UIButton:B]-(>=20)-[UIButton:C]   (active)>",
    "<NSLayoutConstraint:0x1c0094780 UIButton:C.trailing == UIView:parent.trailing - 16   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x1c0094730 H:[UIButton:B]-(>=20)-[UIButton:C]   (active)>

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.

where A, B, C are presented Buttons, parent is their parent view. Entire parent view is inside parentParent and all is in top view.

您的视图已将自动调整大小的蒙版转换为约束,请尝试将其删除:

button.translatesAutoresizingMaskIntoConstraints = false

I have tested your constraints but I don't see errors.

Unfortunately the console log at runtime is not fun to read, if you use a Xcode >= 7 you can set an identifier to your constraints, select it and go to the "Attributes inspector" like in this image:

在此处输入图片说明

After this, your log is more readable.

If you have problems, you can edit your post with the complete log of the error.

EDIT:

The problem would seem with the parent(s) view.

In this image you can see my test (without errors in the log), I've added only the height constraints to parent and parentParent, you can check the difference.

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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