如何在UIStackView中添加前导填充添加到视图中

Adr*_*ian 101 uiscrollview ios swift uistackview

这是我的设置:我有一个UIScrollView领先的,顶部的,试验边缘设置为0.在此我添加一个UIStackView有这个约束:

stackView.centerYAnchor.constraintEqualToAnchor(selectedContactsScrollView.centerYAnchor).active = true  
stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true
Run Code Online (Sandbox Code Playgroud)

在堆栈视图中,我添加了一些视图.
我的问题是,由于约束,添加到堆栈视图的第一个视图也将具有前沿= 0.

我可以在第一个视图中添加一些填充的方法是什么?无需调整滚动视图约束.

Tol*_*kur 333

isLayoutMarginsRelativeArrangementproperty为true时,堆栈视图将相对于其布局边距布置其排列的视图.

stackView.layoutMargins = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
stackView.isLayoutMarginsRelativeArrangement = true
Run Code Online (Sandbox Code Playgroud)

但它会影响堆栈视图内部的所有排列视图.如果只想为一个排列的视图填充此填充,则需要使用嵌套UIStackView

  • _2019 年 2 月,午夜坐在办公室_ - 这些答案给了我前进的力量。谢谢@tolpp (4认同)
  • @maross在Swift中getter和setter函数之间没有区别.但是你是对的,用Objective-C开发的人应该使用`layoutMarginsRelativeArrangement`代替.官方文档:https://developer.apple.com/reference/uikit/uistackview/1616220-islayoutmarginsrelativearrangeme (3认同)
  • `isLayoutMarginsRelativeArrangement`是一个getter,setter是`layoutMarginsRelativeArrangement`.我无法编辑答案 (2认同)
  • 对于Objective-C:`stackView.layoutMargins = UIEdgeInsetsMake(0,20,0,20); [stackView setLayoutMarginsRelativeArrangement:YES];` (2认同)

Zap*_*ndr 141

我发现约束在Stack View中不起作用,或者它们看起来有些奇怪.

(例如,如果我在图像堆栈视图中添加了前导/尾随约束,那么也会添加导致到集合视图,但不会添加尾随;并且肯定会发生冲突).

stackview里面的stackview

要为stackview中的所有视图设置布局边距,请选择:

Stack View > Size Inspector > Layout Margins > Fixed

注意:"Fixed"之前调用选项"Explicit",如屏幕截图所示.

然后添加填充:

故事板

  • Apple隐藏的一件事.我讨厌Xcode如何与好,友好和容易相反.谢谢 (17认同)
  • FYI XCode 9现在将其称为"固定"而不是"明确". (12认同)

Wil*_*aan 24

您提供的解决方案不会在UIStackView中为您的视图添加填充(正如您在问题中所希望的那样),但它为UIStackView添加了一个前导.

一个解决方案可能是在原始的UIStackView中添加另一个UIStackView,并提供这个新的UIStackVIew.然后,将您的视图添加到这个新的UIStackView.

提示,您可以使用Interface Builder完全完成.换句话说,不需要为它编写代码.


dor*_*rsz 15

对我有用的是添加到堆栈视图另一个UIView,它只是一个spacer(至少与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)...
Run Code Online (Sandbox Code Playgroud)


小智 8

将 stackview 对齐方式设置为“居中”。之后,您可以为每个子视图指定不同的前导和尾随。


小智 6

如果您只需要前导填充,那么您可以将堆栈视图的对齐设置为“尾随”,然后您就可以自由地在其包含的每个子视图上指定唯一的前导约束。

作为奖励,您还可以将堆栈视图的对齐方式设置为“居中”,然后您可以使用前导和/或尾随约束为每个项目在两侧提供自己的填充。


Wil*_* Hu 5

迅捷3:您只需要设置偏移量即可:

firstView.leadingAnchor.constraint(equalTo: parentView.leadingAnchor, constant: 200).isActive = true
Run Code Online (Sandbox Code Playgroud)

确保在您之后设置此约束 parentView.addArrangdSubView(firstView)