【问题标题】:Auto layout errors when adding "line" to view on iOS 7在 iOS 7 上添加“行”以查看时出现自动布局错误
【发布时间】:2015-05-30 11:40:53
【问题描述】:

我有七个并排的元素,自动布局应该计算它的宽度,父视图应该确定它的高度。在这个父视图上,我想添加一条线来更清楚地分隔区域。添加此行(具有背景颜色的 UIView)时,我在父视图(七个元素的容器)和其他视图之一的右侧看到一些黑条。

如果我不添加此行,它在 iOS 7 上可以正常工作。在 iOS 8 上,即使该行存在,它也可以工作。这些是我对该行的自动布局约束:

V:[line(==0.5)]|H:|-0-[line]-0-|

这七个标签具有以下约束:

H:|-0-[first][second(==first)][third(==first)][fourth(==first)][fifth(==first)][sixt(==first)][seventh(==first)]-0-|

V:|[first]|

等等。

为什么 iOS 7 自动布局系统无法添加行?如何正确添加我的行?

编辑:

我的七个标签位于容器视图中 - 标题header 与集合视图(作为子视图控制器添加)一起放置在普通视图控制器上。这个“主”视图控制器(或容器,如果你想)有以下约束:

H:|-0-[header]-0-| - 包含七个标签的标题
H:|-0-[monthView]-0-| - 集合视图
H:|-0-[toolbar]-0-| - 工具栏
V:|-0-[header(==15)][monthView][toolbar(==44)]-0-| - 垂直放置所有三个元素

一旦加载了所有视图,我就设法获得自动布局跟踪:

*<UIWindow:0x7897f370> - AMBIGUOUS LAYOUT
|   *<UILayoutContainerView:0x78eb09f0>
|   |   *<UINavigationTransitionView:0x78db1b50>
|   |   |   *<UIViewControllerWrapperView:0x78dbb400>
|   |   |   |   *<UIView:0x7897c780>
|   |   |   |   |   *<MonthView_MonthViewHeader:0x78ddd600>
|   |   |   |   |   |   *<UILabel:0x78ddede0>
|   |   |   |   |   |   *<UILabel:0x78de29e0>
|   |   |   |   |   |   *<UILabel:0x78de2a90>
|   |   |   |   |   |   *<UILabel:0x78de2bc0>
|   |   |   |   |   |   *<UILabel:0x78de2de0>
|   |   |   |   |   |   *<UILabel:0x78de3140>
|   |   |   |   |   |   *<UILabel:0x78de3360>
|   |   |   |   |   |   *<UIView:0x78de3580>
|   |   |   |   |   *<UICollectionViewControllerWrapperView:0x78ebdd00>
|   |   |   |   |   |   *<UICollectionView:0x795c1a00>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78ed1270>
|   |   |   |   |   |   |   |   <UIView:0x78d2cab0>
|   |   |   |   |   |   |   |   *<UIView:0x78d2d660>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d2c8b0>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d2c6a0>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d29450>
|   |   |   |   |   |   |   |   <UIView:0x78d290d0>
|   |   |   |   |   |   |   |   *<UIView:0x78d293f0>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d29020>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d28f10>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d27ec0>
|   |   |   |   |   |   |   |   <UIView:0x78d27c30>
|   |   |   |   |   |   |   |   *<UIView:0x78d27e60>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d27b80>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d27a70>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d26a20>
|   |   |   |   |   |   |   |   <UIView:0x78d26790>
|   |   |   |   |   |   |   |   *<UIView:0x78d269c0>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d266e0>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d265d0>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d253e0>
|   |   |   |   |   |   |   |   <UIView:0x78d25170>
|   |   |   |   |   |   |   |   *<UIView:0x78d25380>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d250c0>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d24fb0>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d23f60>
|   |   |   |   |   |   |   |   <UIView:0x78d23cd0>
|   |   |   |   |   |   |   |   *<UIView:0x78d23f00>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d23c20>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d23b10>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d1ed90>
|   |   |   |   |   |   |   |   <UIView:0x78d1eb00>
|   |   |   |   |   |   |   |   *<UIView:0x78d1ed30>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d1ea50>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d1e940>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d1d860>
|   |   |   |   |   |   |   |   <UIView:0x78d1d610>
|   |   |   |   |   |   |   |   *<UIView:0x78d1d800>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d1d560>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d1d450>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d1c3f0>
|   |   |   |   |   |   |   |   <UIView:0x78d1c160>
|   |   |   |   |   |   |   |   *<UIView:0x78d1c390>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d1c0b0>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d1bfa0>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d1af40>
|   |   |   |   |   |   |   |   <UIView:0x78d1acb0>
|   |   |   |   |   |   |   |   *<UIView:0x78d1aee0>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d1ac00>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d1aaf0>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d19a90>
|   |   |   |   |   |   |   |   <UIView:0x78d19800>
|   |   |   |   |   |   |   |   *<UIView:0x78d19a30>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d19750>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d19640>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d185e0>
|   |   |   |   |   |   |   |   <UIView:0x78d18350>
|   |   |   |   |   |   |   |   *<UIView:0x78d18580>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d182a0>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d18190>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d170c0>
|   |   |   |   |   |   |   |   <UIView:0x78d16e60>
|   |   |   |   |   |   |   |   *<UIView:0x78d17060>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d16db0>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d16ca0>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d15c40>
|   |   |   |   |   |   |   |   <UIView:0x78d159b0>
|   |   |   |   |   |   |   |   *<UIView:0x78d15be0>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d15900>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d157f0>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d14790>
|   |   |   |   |   |   |   |   <UIView:0x78d14500>
|   |   |   |   |   |   |   |   *<UIView:0x78d14730>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d14450>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d14340>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d132e0>
|   |   |   |   |   |   |   |   <UIView:0x78d13050>
|   |   |   |   |   |   |   |   *<UIView:0x78d13280>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d12fa0>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d12e90>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d11e30>
|   |   |   |   |   |   |   |   <UIView:0x78d11ba0>
|   |   |   |   |   |   |   |   *<UIView:0x78d11dd0>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d11af0>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d119e0>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d10980>
|   |   |   |   |   |   |   |   <UIView:0x78d106f0>
|   |   |   |   |   |   |   |   *<UIView:0x78d10920>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d10640>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d10530>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d0f4d0>
|   |   |   |   |   |   |   |   <UIView:0x78d0f240>
|   |   |   |   |   |   |   |   *<UIView:0x78d0f470>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d0f190>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d0f080>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d0e020>
|   |   |   |   |   |   |   |   <UIView:0x78d0dd90>
|   |   |   |   |   |   |   |   *<UIView:0x78d0dfc0>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d0dce0>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d0dbd0>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d0c960>
|   |   |   |   |   |   |   |   <UIView:0x78d0c740>
|   |   |   |   |   |   |   |   *<UIView:0x78d17190>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d0c690>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d0c580>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d0b520>
|   |   |   |   |   |   |   |   <UIView:0x78d0b290>
|   |   |   |   |   |   |   |   *<UIView:0x78d0b4c0>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d0b1e0>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d0b0d0>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d0a070>
|   |   |   |   |   |   |   |   <UIView:0x78d09de0>
|   |   |   |   |   |   |   |   *<UIView:0x78d0a010>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d09d30>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d09c20>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d08bc0>
|   |   |   |   |   |   |   |   <UIView:0x78d08930>
|   |   |   |   |   |   |   |   *<UIView:0x78d08b60>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d08880>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d08770>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d07710>
|   |   |   |   |   |   |   |   <UIView:0x78d07480>
|   |   |   |   |   |   |   |   *<UIView:0x78d076b0>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d073d0>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d072c0>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d06150>
|   |   |   |   |   |   |   |   <UIView:0x78d05ec0>
|   |   |   |   |   |   |   |   *<UIView:0x78d060f0>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d05e10>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d05d00>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d04ca0>
|   |   |   |   |   |   |   |   <UIView:0x78d04a10>
|   |   |   |   |   |   |   |   *<UIView:0x78d04c40>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d04960>
|   |   |   |   |   |   |   |   |   *<Circle:0x78d3c6b0>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d04850>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d037f0>
|   |   |   |   |   |   |   |   <UIView:0x78d03560>
|   |   |   |   |   |   |   |   *<UIView:0x78d03790>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d034b0>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d033a0>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d02270>
|   |   |   |   |   |   |   |   <UIView:0x78d01fe0>
|   |   |   |   |   |   |   |   *<UIView:0x78d02210>
|   |   |   |   |   |   |   |   |   *<UIView:0x78d01f30>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78d01e20>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78d00dc0>
|   |   |   |   |   |   |   |   <UIView:0x78d00b30>
|   |   |   |   |   |   |   |   *<UIView:0x78d00d60>
|   |   |   |   |   |   |   |   |   *<UIView:0x78e64000>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78ed2dd0>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78ed3e60>
|   |   |   |   |   |   |   |   <UIView:0x78ed4130>
|   |   |   |   |   |   |   |   *<UIView:0x78ed3f00>
|   |   |   |   |   |   |   |   |   *<UIView:0x78ed41e0>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78ed42a0>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78ed5310>
|   |   |   |   |   |   |   |   <UIView:0x78ed55e0>
|   |   |   |   |   |   |   |   *<UIView:0x78ed53b0>
|   |   |   |   |   |   |   |   |   *<UIView:0x78ed5690>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78ed5750>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78ed67c0>
|   |   |   |   |   |   |   |   <UIView:0x78ed6a90>
|   |   |   |   |   |   |   |   *<UIView:0x78ed6860>
|   |   |   |   |   |   |   |   |   *<UIView:0x78ed6b40>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78ed6c00>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78ed7eb0>
|   |   |   |   |   |   |   |   <UIView:0x78ed8180>
|   |   |   |   |   |   |   |   *<UIView:0x78ed7f50>
|   |   |   |   |   |   |   |   |   *<UIView:0x78ed8230>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78ed82f0>
|   |   |   |   |   |   |   *<MonthView_MonthViewCell:0x78ed9360>
|   |   |   |   |   |   |   |   <UIView:0x78ed9630>
|   |   |   |   |   |   |   |   *<UIView:0x78ed9400>
|   |   |   |   |   |   |   |   |   *<UIView:0x78ed96e0>
|   |   |   |   |   |   |   |   |   *<UILabel:0x78ed97a0>
|   |   |   |   |   |   |   *<MonthView_SectionHeader:0x78edb330>
|   |   |   |   |   |   |   |   *<UIView:0x78eda940>
|   |   |   |   |   |   |   |   *<UIView:0x78edc740>
|   |   |   |   |   |   |   |   *<UIView:0x78edc7a0>
|   |   |   |   |   |   |   |   *<UIView:0x78edca50>
|   |   |   |   |   |   |   |   *<UIView:0x78edcae0>
|   |   |   |   |   |   |   |   *<UIView:0x78edcb70>
|   |   |   |   |   |   |   |   *<UIView:0x78edcc00>
|   |   |   |   |   |   |   |   *<UILabel:0x78edcc90>
|   |   |   |   |   |   |   <UIImageView:0x78df2690>
|   |   |   |   |   |   |   <UIImageView:0x78df1c40>
|   |   |   |   |   |   *<MonthView_SectionOverlay:0x78dc8fd0>
|   |   |   |   |   |   |   *<GradientView:0x78dcc780>
|   |   |   |   |   |   |   *<UILabel:0x78dd3ea0>
|   |   |   |   |   |   *<_UILayoutGuide:0x78dc8a20> - AMBIGUOUS LAYOUT
|   |   |   |   |   *<MonthView_Toolbar:0x78de7540>
|   |   |   |   |   |   <_UIToolbarBackground:0x78de7c40>
|   |   |   |   |   |   |   <_UIBackdropView:0x78d3e940>
|   |   |   |   |   |   |   |   <_UIBackdropEffectView:0x78d3e730>
|   |   |   |   |   |   |   |   <UIView:0x78d3e650>
|   |   |   |   |   |   <UIImageView:0x78de8c70>
|   |   |   |   |   |   <UIToolbarTextButton:0x78dfa240>
|   |   |   |   |   |   |   <_UIToolbarNavigationButton:0x78df9aa0>
|   |   |   |   |   |   |   |   <UIButtonLabel:0x78ef69f0>
|   |   |   |   |   |   <UIToolbarTextButton:0x78dfaa50>
|   |   |   |   |   |   |   <_UIToolbarNavigationButton:0x78d3eb00>
|   |   |   |   |   |   |   |   <UIButtonLabel:0x78ef5740>
|   |   <UINavigationBar:0x78eb1ad0>
|   |   |   <_UINavigationBarBackground:0x78eb2170>
|   |   |   |   <_UIBackdropView:0x78db8270>
|   |   |   |   |   <_UIBackdropEffectView:0x78dba8d0>
|   |   |   |   |   <UIView:0x78dbb3a0>
|   |   |   |   <UIImageView:0x78eb24e0>
|   |   |   <_UINavigationBarBackIndicatorView:0x78eb4f30>

Here可以在视图加载后找到递归描述。

【问题讨论】:

  • 您是通过代码还是通过故事板设置约束?如果您选择了第一种方式,为什么不尝试在界面生成器中创建该行?
  • 我没有使用故事板。全部在代码中。
  • 约束是双向的。有时,视图与其子视图之间的约束可能会导致父视图的大小发生变化以满足约束。也许它很难将宽度均匀地除以七,所以它正在调整超级视图的大小。所以问题是视图对主视图有什么限制。它有H:|[container]| 约束吗?
  • 好的,关于编码约束我很遗憾不能帮助你:/
  • @Rob:问题是我的约束是否错误,以及大小变化的原因是什么。有趣的是,未涉及的视图也会更改其宽度(仅与父视图相关 - 视图控制器)。是的,容器有这个约束H:|-0-[header]-0-|

标签: ios autolayout nslayoutconstraint


【解决方案1】:

我想我永远不会发现 iOS 7 上的自动布局系统出了什么问题。但我现在使用一种解决方法:我没有像七个标签那样将线添加到同一个视图中,而是将它添加到另一个容器中。伪代码:

weekdayHeader = [label1]-[label7]
monthViewHeader = [weekdayHeader][line(==0.5)]

monthViewHeader 与我的其他视图(UICollectionViewUIToolbar)一起添加到我的主视图控制器/容器中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 2015-01-23
    • 2023-03-30
    • 2015-05-24
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    相关资源
    最近更新 更多