【发布时间】:2015-08-08 23:52:39
【问题描述】:
我有一个以前从未遇到过的非常奇怪的自动布局问题。我不确定这是一个错误还是我在做一些愚蠢的事情。 首先是使用 Xcode 7 beta 5 并在 iOS 9 模拟器上运行。 所需的外观是在顶部显示一个工具栏,其中有几个按钮(其中一个仅在需要时出现)和一个填充屏幕其余部分的集合视图,如下所示:
我有约束保持工具栏靠在顶部、左侧和右侧边缘以及触摸它下面的集合视图。集合视图除了到其上方工具栏的 0 点距离外,还与视图的底部、左侧和右侧边缘有 0 点连接。
然而,我实际上得到的是控制台中的两个通知,即存在无法同时满足的约束。下面显示了被破坏的约束以及列出的所有约束,但它们是工具栏的高度以及工具栏和集合视图之间的 0 点间距。
通知列出了问题中涉及的所有约束,然后是它将打破以使事情正常进行的约束(它总是选择错误的约束……):
"<_UILayoutSupportConstraint:0x7fbaf9fd0e20 V:[_UILayoutGuide:0x7fbaf9fd9b40(20)]>",
"<_UILayoutSupportConstraint:0x7fbaf9fc94c0 V:|-(0)-[_UILayoutGuide:0x7fbaf9fd9b40] (Names: '|':UIView:0x7fbaf9fd9450 )>",
"<NSLayoutConstraint:0x7fbaf9d3f8d0 'toolbarHeight' V:[UIToolbar:0x7fbaf9d3f6f0(44)]>",
"<NSLayoutConstraint:0x7fbaf9fda8a0 'toolbarToCollectionView' V:[UIToolbar:0x7fbaf9d3f6f0]-(0)-[UICollectionView:0x7fbafa84c000]>",
"<NSLayoutConstraint:0x7fbaf9fa67e0 'toolbarTop' V:[_UILayoutGuide:0x7fbaf9fd9b40]-(0)-[UIToolbar:0x7fbaf9d3f6f0]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fbaf9d4ac90 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' V:|-(0)-[UIView:0x7fbaf9fd9450] (Names: '|':UITransitionView:0x7fbaf9fd91d0 )>"
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7fbaf9d3f8d0 'toolbarHeight' V:[UIToolbar:0x7fbaf9d3f6f0(44)]>
"<_UILayoutSupportConstraint:0x7fbaf9fd0e20 V:[_UILayoutGuide:0x7fbaf9fd9b40(20)]>",
"<_UILayoutSupportConstraint:0x7fbaf9fc94c0 V:|-(0)-[_UILayoutGuide:0x7fbaf9fd9b40] (Names: '|':UIView:0x7fbaf9fd9450 )>",
"<NSLayoutConstraint:0x7fbaf9fda8a0 'toolbarToCollectionView' V:[UIToolbar:0x7fbaf9d3f6f0]-(0)-[UICollectionView:0x7fbafa84c000]>",
"<NSLayoutConstraint:0x7fbaf9fa67e0 'toolbarTop' V:[_UILayoutGuide:0x7fbaf9fd9b40]-(0)-[UIToolbar:0x7fbaf9d3f6f0]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fbaf9d4ac90 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' V:|-(0)-[UIView:0x7fbaf9fd9450] (Names: '|':UITransitionView:0x7fbaf9fd91d0 )>"
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7fbaf9fda8a0 'toolbarToCollectionView' V:[UIToolbar:0x7fbaf9d3f6f0]-(0)-[UICollectionView:0x7fbafa84c000]>
鉴于两组约束列表NSAutoresizingMaskLayoutConstraint 我添加了以下代码来尝试阻止添加额外的约束,它没有任何效果......
collectionView.translatesAutoresizingMaskIntoConstraints = false
toolbar.translatesAutoresizingMaskIntoConstraints = false
如果我将视图本身设置为不将自动调整大小掩码转换为约束,并且所有显示都是黑色的(但集合视图确实被创建,但被埋在某处)。
问题似乎是NSAutoresizingMaskLayoutConstraint,但我不知道如何让它消失。
这一切都源于测试版中的错误吗?是否有一些奇怪的最小集合视图大小(看起来集合视图是一个屏幕猪)?还是我遗漏了一些东西(可能是非常明显的东西)?
我通过强制集合视图在viewDidAppear() 中具有适当的帧大小来获得第一张图像,但是一旦集合视图向下滚动,它就会脱离框架并占据整个屏幕。
如果我调试视图层次结构,工具栏实际上会显示在集合视图的后面,因此它会被绘制。
【问题讨论】:
标签: xcode autolayout uicollectionview ios9