获取约束来在大小类中工作

所以,我在Xcode 6 beta中玩弄了大小类。 我对图像设置了一些限制,使其位于与iPhone纵向和横向对应的大小类别不同的​​位置。

约束在下面的图片中可见。 正如你所看到的,当我处于Compact / Compact时,一些约束被“安装”,而另一些约束不被约束,而在Compact / Regular中约束被安装。

小型/紧凑型紧凑型/定期

然而,我得到一个错误(在两个屏幕截图中略微可见),基本上声称,我卸载的约束干扰我安装的约束(如果它们同时运行,是正确的),但不应该为每个尺寸的卸载约束class级甚至没有运行? 安装的限制条件都不会造成对方的问题。

出现的错误是:

2014-06-30 21:14:26.215 TV Tracker[26417:1434692] SetAppThreadPriority: setpriority failed with error 45 2014-06-30 21:14:26.372 TV Tracker[26417:1434692] 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:0x10bb11da0 H:|-(24)-[UILabel:0x10bb4db70'TV Tracker uses your Trak...'] (Names: '|':UIControl:0x10bb2db60 )>", "<NSLayoutConstraint:0x10bb11df0 H:[UIImageView:0x10bb44740]-(>=18)-[UILabel:0x10bb4db70'TV Tracker uses your Trak...']>", "<NSLayoutConstraint:0x10bb2f420 H:|-(20)-[UIButton:0x10bb35470'Sign In'] (Names: '|':UIControl:0x10bb2db60 )>", "<NSLayoutConstraint:0x10bb2f470 UIButton:0x10bb35470'Sign In'.leading == UIImageView:0x10bb44740.leading>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x10bb11df0 H:[UIImageView:0x10bb44740]-(>=18)-[UILabel:0x10bb4db70'TV Tracker uses your Trak...']> 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. 2014-06-30 21:14:26.373 TV Tracker[26417:1434692] 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:0x10bb11e90 H:[UILabel:0x10bb4db70'TV Tracker uses your Trak...']-(23)-| (Names: '|':UIControl:0x10bb2db60 )>", "<NSLayoutConstraint:0x10bb11ee0 UILabel:0x10bb4db70'TV Tracker uses your Trak...'.trailing == UIButton:0x10bb44ec0'Register'.trailing>", "<NSLayoutConstraint:0x10bb2f510 H:[UIButton:0x10bb44ec0'Register']-(20)-| (Names: '|':UIControl:0x10bb2db60 )>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x10bb11ee0 UILabel:0x10bb4db70'TV Tracker uses your Trak...'.trailing == UIButton:0x10bb44ec0'Register'.trailing> 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. 2014-06-30 21:14:26.388 TV Tracker[26417:1434692] 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:0x10bb49e10 h=-&- v=-&- UIControl:0x10bb2db60.width == UIViewControllerWrapperView:0x10d102000.width>", "<NSAutoresizingMaskLayoutConstraint:0x10bb55d10 h=-&- v=-&- UIViewControllerWrapperView:0x10d102000.width == UINavigationTransitionView:0x10bc6f770.width>", "<NSAutoresizingMaskLayoutConstraint:0x10bb3cda0 h=-&- v=-&- UINavigationTransitionView:0x10bc6f770.width == UILayoutContainerView:0x10bc6e3e0.width>", "<NSAutoresizingMaskLayoutConstraint:0x10bb29960 h=-&- v=-&- UILayoutContainerView:0x10bc6e3e0.width == UITransitionView:0x10bc73670.width>", "<NSAutoresizingMaskLayoutConstraint:0x10bb559e0 h=-&- v=-&- UITransitionView:0x10bc73670.width == UIWindow:0x10d068e70.width>", "<NSAutoresizingMaskLayoutConstraint:0x10bb56880 h=--- v=--- H:[UIWindow:0x10d068e70(320)]>", "<NSLayoutConstraint:0x10bb2f420 H:|-(20)-[UIButton:0x10bb35470'Sign In'] (Names: '|':UIControl:0x10bb2db60 )>", "<NSLayoutConstraint:0x10bb2f470 UIButton:0x10bb35470'Sign In'.leading == UIImageView:0x10bb44740.leading>", "<NSLayoutConstraint:0x10bb44570 UIControl:0x10bb2db60.centerX == UIImageView:0x10bb44740.centerX>", "<NSLayoutConstraint:0x10bb3c840 H:[UIImageView:0x10bb44740(92)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x10bb3c840 H:[UIImageView:0x10bb44740(92)]> 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. 2014-06-30 21:14:26.389 TV Tracker[26417:1434692] 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) ( "<_UILayoutSupportConstraint:0x10bd1c8a0 V:[_UILayoutGuide:0x10bb4acb0(64)]>", "<_UILayoutSupportConstraint:0x10bd1fbf0 V:|-(0)-[_UILayoutGuide:0x10bb4acb0] (Names: '|':UIControl:0x10bb2db60 )>", "<NSAutoresizingMaskLayoutConstraint:0x10bb56d40 h=-&- v=-&- UIControl:0x10bb2db60.height == UIViewControllerWrapperView:0x10d102000.height>", "<NSAutoresizingMaskLayoutConstraint:0x10bb56c60 h=-&- v=-&- UIViewControllerWrapperView:0x10d102000.height == UINavigationTransitionView:0x10bc6f770.height>", "<NSAutoresizingMaskLayoutConstraint:0x10bb3cbb0 h=-&- v=-&- UINavigationTransitionView:0x10bc6f770.height == UILayoutContainerView:0x10bc6e3e0.height>", "<NSAutoresizingMaskLayoutConstraint:0x10bb4a920 h=-&- v=-&- UILayoutContainerView:0x10bc6e3e0.height == UITransitionView:0x10bc73670.height>", "<NSAutoresizingMaskLayoutConstraint:0x10bb0e3a0 h=-&- v=-&- UITransitionView:0x10bc73670.height == UIWindow:0x10d068e70.height>", "<NSAutoresizingMaskLayoutConstraint:0x10bb44d20 h=--- v=--- V:[UIWindow:0x10d068e70(568)]>", "<NSLayoutConstraint:0x10bb44520 UIControl:0x10bb2db60.centerY == UIImageView:0x10bb44740.centerY>", "<NSLayoutConstraint:0x10bb445c0 V:[_UILayoutGuide:0x10bb4acb0]-(24)-[UIImageView:0x10bb44740]>", "<NSLayoutConstraint:0x10bb49b60 V:[UIImageView:0x10bb44740(100)]>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x10bb49b60 V:[UIImageView:0x10bb44740(100)]> 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. 2014-06-30 21:14:26.396 TV Tracker[26417:1434692] 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) ( "<_UILayoutSupportConstraint:0x10bd13470 V:[_UILayoutGuide:0x10bb4c690(0)]>", "<_UILayoutSupportConstraint:0x10bd13410 _UILayoutGuide:0x10bb4c690.bottom == UIControl:0x10bb2db60.bottom>", "<NSAutoresizingMaskLayoutConstraint:0x10bb56d40 h=-&- v=-&- UIControl:0x10bb2db60.height == UIViewControllerWrapperView:0x10d102000.height>", "<NSAutoresizingMaskLayoutConstraint:0x10bb56c60 h=-&- v=-&- UIViewControllerWrapperView:0x10d102000.height == UINavigationTransitionView:0x10bc6f770.height>", "<NSAutoresizingMaskLayoutConstraint:0x10bb3cbb0 h=-&- v=-&- UINavigationTransitionView:0x10bc6f770.height == UILayoutContainerView:0x10bc6e3e0.height>", "<NSAutoresizingMaskLayoutConstraint:0x10bb4a920 h=-&- v=-&- UILayoutContainerView:0x10bc6e3e0.height == UITransitionView:0x10bc73670.height>", "<NSAutoresizingMaskLayoutConstraint:0x10bb0e3a0 h=-&- v=-&- UITransitionView:0x10bc73670.height == UIWindow:0x10d068e70.height>", "<NSAutoresizingMaskLayoutConstraint:0x10bb44d20 h=--- v=--- V:[UIWindow:0x10d068e70(568)]>", "<NSLayoutConstraint:0x10bb11e40 UIControl:0x10bb2db60.centerY == UILabel:0x10bb4db70'TV Tracker uses your Trak...'.centerY + 0.25>", "<NSLayoutConstraint:0x10bb2f3d0 V:[UILabel:0x10bb4db70'TV Tracker uses your Trak...']-(91)-[_UILayoutGuide:0x10bb4c690]>", "<NSLayoutConstraint:0x10bb2d790 V:[UILabel:0x10bb4db70'TV Tracker uses your Trak...'(69)]>" ) Will attempt to recover by breaking constraint 

 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. 

紧凑/紧凑型约束的侧边栏看起来像 C / C侧栏

Compact / Regular约束的边栏看起来像 C / R侧边栏

此login控制器的我的视图层次结构: 视图层次

我第一次尝试这个function时遇到了同样的问题,直到我意识到“+”button告诉我的是什么。 起初,我已经改变了大小类,并删除了一个视图,并添加了一个视图,或删除了一个约束,并添加了一个约束。 那是错的! 您不能删除或添加视图或约束在每个大小的基础上; 他们都必须在每一个规模的class级 – 只有一些被标记为“安装”这个规模的类别,其他人不是。

这里有一些进一步的build议。

  • 看看你的屏幕截图的顶部。 你从界面生成器得到警告 – 并忽略它们。 不要忽视他们! 这些警告告诉你,你的约束不是你所想象的。

  • 在canvas左侧显示视图层次结构列表(它隐藏在屏幕截图中),并继续查看和处理每个大小类的组合,直到没有更多警告为止。 它还会告诉你什么约束和意见是在大众案件和特定的大小类案件你正在看(见下面的屏幕截图)。

  • 使用右侧属性检查器中的“+”button来确保您具有每个相关大小类案例的值。 您不添加或删除约束或类:添加“已安装”button并标记其大小类,并选中或取消选中它们(再次查看屏幕快照)。

在这里输入图像说明

最后,使用预览助手确保视图看起来像你期望的样子。 看下面的可爱animation。

在这里输入图像说明

例如,如果您可以注意到您的日志中的第一个警告 – (24) – [UILabel:0x10bb4db70'TV Tracker使用您的Trak …']它清楚地表明,有一个约束是由您添加不是必需的。 举一个这样的例子,如果为任何对象添加顶部空间和底部空间,则无需为该对象设置高度,因为该对象将根据您提供的顶部和底部空间进行扩展。 就像同样的方式你的日志还说,UILable不需要的高度/宽度/ x / y等于24.请find它,并从故事板中删除,将解决您的问题。