为什么AutoLayout的决定远远低于实际?

时间:2015-12-25 06:08:31

标签: ios autolayout

请看图片。实际宽度为228,但为什么预期宽度为25?即使我尝试更新约束,它也什么都不做。

enter image description here

  

我在Simulator中获得了以下输出。

enter image description here

当我尝试添加宽度约束时,正如少数评论中所建议的那样,我得到了例外。

2015-12-25 11:43:21.813 To Do List[1285:24043] 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:0x7fad907143b0 H:[UITextView:0x7fad90841400(228)]>",
    "<NSLayoutConstraint:0x7fad9055a510 UILabel:0x7fad9056e950'Task'.leading == UIView:0x7fad9056e7f0.leadingMargin + 84>",
    "<NSLayoutConstraint:0x7fad9055a560 UILabel:0x7fad9056c6b0'Info'.leading == UILabel:0x7fad9056e950'Task'.leading>",
    "<NSLayoutConstraint:0x7fad90512810 UITextField:0x7fad9056c8c0.leading == UITextView:0x7fad90841400.leading>",
    "<NSLayoutConstraint:0x7fad90512860 UITextField:0x7fad9056c8c0.trailing == UITextView:0x7fad90841400.trailing>",
    "<NSLayoutConstraint:0x7fad9055c970 UITextField:0x7fad9056c8c0.centerX == UIView:0x7fad9056e7f0.centerX>",
    "<NSLayoutConstraint:0x7fad9055ca10 H:[UILabel:0x7fad9056c6b0'Info']-(53)-[UITextView:0x7fad90841400]>",
    "<NSLayoutConstraint:0x7fad90578dd0 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fad9056e7f0(414)]>" )

Will attempt to recover by breaking constraint  <NSLayoutConstraint:0x7fad907143b0 H:[UITextView:0x7fad90841400(228)]>

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.

3 个答案:

答案 0 :(得分:0)

它看起来像是因为您将一些视图固定在一起以获得宽度,同时还设置了前导和中心约束。他唯一的选择是缩小观点。

您最有可能想要删除中心约束,而是删除尾随或宽度。

答案 1 :(得分:0)

也许你把故事板设置为w任何h任何。尝试将故事板更改为紧凑宽度常规高度或任何其他设置,看看是否有帮助。

由此改变: enter image description here

对于这些设置中的任何一个(我更喜欢使用后者):
enter image description here

如果这不起作用,请确保为文本视图设置高度和宽度约束。单击控件并在textview中水平拖动并设置宽度约束。单击控件并在文本字段中垂直拖动并设置高度约束。

答案 2 :(得分:0)

你在Xcode中收到警告,因为文本字段中没有文字,所以它的内在内容非常窄,你没有约束它的宽度使它更宽。

当您将其宽度限制为228时,在运行时会出现错误,因为您的其他约束不会留下足够的空间使其达到228点宽。这就是原因:

"<NSLayoutConstraint:0x7fad90578dd0 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fad9056e7f0(414)]>" )

UIKit使用UIView-Encapsulated-Layout-Width约束视图控制器以适应屏幕,因此这个约束告诉我6e7f0是你的视图控制器的根视图。

此约束中的414告诉我您正在iPhone 6 Plus或6S Plus上进行测试,因为只有那些设备的宽度为414点。

视图控制器在6+上的根视图的默认layoutMargins是前沿和后沿上的20个点。

"<NSLayoutConstraint:0x7fad9055a510 UILabel:0x7fad9056e950'Task'.leading == UIView:0x7fad9056e7f0.leadingMargin + 84>",

“任务”标签的前沿距离根视图的前缘为84点,因此它将位于104.

"<NSLayoutConstraint:0x7fad9055a560 UILabel:0x7fad9056c6b0'Info'.leading == UILabel:0x7fad9056e950'Task'.leading>",

“信息”标签的前沿也将是104。

"<NSLayoutConstraint:0x7fad9055ca10 H:[UILabel:0x7fad9056c6b0'Info']-(53)-[UITextView:0x7fad90841400]>",

文本视图的前沿距离“信息”标签的后缘有53个点。

“信息”标签的固有宽度(默认字体和大小)为29。

因此文本视图的前沿将是104 + 29 + 53 = 186。

"<NSLayoutConstraint:0x7fad90512810 UITextField:0x7fad9056c8c0.leading == UITextView:0x7fad90841400.leading>",

文本字段的前沿也位于186。

"<NSLayoutConstraint:0x7fad9055c970 UITextField:0x7fad9056c8c0.centerX == UIView:0x7fad9056e7f0.centerX>",

文本字段将居中。由于其前缘为186,这意味着其后缘必须距离其容器的后缘186个点。

它的容器,根视图,是414点宽。因此,文本字段的后沿位于414 - 186 = 228。

文本字段的前沿位于186,其后沿位于228,因此其宽度必须为42 (= 228 - 186)。

您在标签周围设置了很大的边距(前端为84,尾侧为53)。布局中唯一的“给定”是文本视图和文本字段的宽度,因此当视图从Xcode中的600x600模板向下移动到iPhone 6 Plus的414x736大小时,这些视图会缩小。

你应该做的是将84更改为零,并将53改为合理的,如8或20。