这是我的设置:我有一个 UIScrollView
,其前导、顶部、试验边缘设置为 0。在其中我添加一个具有以下约束的 UIStackView
:
stackView.centerYAnchor.constraintEqualToAnchor(selectedContactsScrollView.centerYAnchor).active = true
stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true
在堆栈视图中,我添加了一些视图。我的问题是,由于约束,添加到堆栈视图的第一个视图也将具有前沿 = 0。
我可以向第一个视图添加一些填充的方法是什么?无需调整滚动视图约束。
当 isLayoutMarginsRelativeArrangement
属性为 true 时,堆栈视图将相对于其布局边距布局其排列的视图。
stackView.layoutMargins = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
stackView.isLayoutMarginsRelativeArrangement = true
但它会影响堆栈视图内部的所有排列视图。如果您只想为一个排列视图使用此填充,则需要使用嵌套 UIStackView
我发现约束在堆栈视图中不起作用,或者它们看起来有些奇怪。
(例如,如果我将前导/尾随约束添加到图像堆栈视图上的选定内容,这也将前导添加到集合视图,但不添加尾随;肯定会发生冲突)。
https://i.stack.imgur.com/XH82C.png
要为 stackview 中的所有视图设置布局边距,请选择:
Stack View > Size Inspector > Layout Margins > Fixed
注意:"Fixed"
选项以前称为 "Explicit"
,如屏幕截图所示。
然后添加您的填充:
https://i.stack.imgur.com/EvPGh.png
您提供的解决方案不会在 UIStackView 中为您的视图添加填充(正如您在问题中所希望的那样),但它为 UIStackView 添加了前导。
一个解决方案可能是在您的原始 UIStackView 中添加另一个 UIStackView,并为这个新的 UIStackVIew 提供引导。然后,将您的视图添加到这个新的 UIStackView。
提示,您可以使用 Interface Builder 完全做到这一点。换句话说,不需要为它编写代码。
对我有用的是向堆栈视图添加另一个 UIView,它只是一个间隔(至少与 stackView.distribution = .Fill 一起使用):
let spacerView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 10))
stackView.addArrangedSubview(spacerView)
stackView.addArrangedSubview(viewThatNeedsSpaceBeforeIt)
stackView.addArrangedSubview(NextView)...
如果您只需要前导填充,那么您可以将堆栈视图的对齐设置为“尾随”,然后您可以自由地为其包含的每个子视图指定唯一的前导约束。
作为奖励,您还可以将堆栈视图的对齐方式设置为“中心”,然后您可以使用前导和/或尾随约束为每个项目在两侧提供自己的填充。
swift 3:您只需要通过以下方式设置偏移量:
firstView.leadingAnchor.constraint(equalTo: parentView.leadingAnchor, constant: 200).isActive = true
确保在您 parentView.addArrangdSubView(firstView)
之后设置此约束
将您的堆栈视图对齐设置为“中心”。之后,您可以为每个子视图赋予不同的前导和尾随。
解决方案是在堆栈视图中有一个常规视图来保存您想要添加约束的任何视图,然后您可以为您的项目添加与堆栈视图中的视图相关的约束。这样,您的原始视图可以在堆栈视图中具有前导和尾随约束。
这可以在界面构建器中以编程方式完成。
这个问题已经有了很好的答案,不过有一个建议,使用 spacing
属性来设置视图之间的间距。对于第一个和最后一个视图,可以有两个选项,或者将 insets 设置为 @tolpp 建议的,或者添加约束附加到父级(stackview),并使用常量添加填充。
我们所做的是添加透明组件(例如,UIButton/UIView)作为 UIStackView 的第一个和最后一个子项。然后设置约束这些不可见子项的宽度来调整内边距。
似乎解决方案非常简单。代替:
stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true
我刚刚写道:
stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor, constant: 15).active = true
只需在堆栈视图的开头添加一个空视图(同时限制其宽度和/或高度):
stackView.insertArrangedSubview(UIView().constrain(width: 0, height: 0), at: 0)
和/或最后:
stackView.addArrangedSubview(UIView().constrain(width: 0, height: 0))
我创建了这个简单的 UIView 扩展来添加约束:
extension UIView {
func constrain(width: CGFloat, height: CGFloat) -> Self {
NSLayoutConstraint.activate([
widthAnchor.constraint(equalToConstant: width),
heightAnchor.constraint(equalToConstant: height)
])
return self
}
}
isLayoutMarginsRelativeArrangement
是 getter,setter 是layoutMarginsRelativeArrangement
。我无法编辑答案layoutMarginsRelativeArrangement
。官方文档:developer.apple.com/reference/uikit/uistackview/…stackView.layoutMargins = UIEdgeInsetsMake(0, 20, 0, 20); [stackView setLayoutMarginsRelativeArrangement:YES];