ChatGPT解决这个技术问题 Extra ChatGPT

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

这是我的设置:我有一个 UIScrollView,其前导、顶部、试验边缘设置为 0。在其中我添加一个具有以下约束的 UIStackView

stackView.centerYAnchor.constraintEqualToAnchor(selectedContactsScrollView.centerYAnchor).active = true  
stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

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

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

你会改变接受的答案吗?托尔加的回答似乎要好得多。
请不要更改已接受的答案。接受的答案要好得多。 Tolga 的回答没有说明何时进行这些设置,没有考虑 safeAreaLayoutMargins,也没有使用标准布局边距大小。目前尚不清楚如何更改答案以正确执行此操作。

T
Tolga Okur

isLayoutMarginsRelativeArrangement 属性为 true 时,堆栈视图将相对于其布局边距布局其排列的视图。

stackView.layoutMargins = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
stackView.isLayoutMarginsRelativeArrangement = true

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


isLayoutMarginsRelativeArrangement 是 getter,setter 是 layoutMarginsRelativeArrangement。我无法编辑答案
@maross Swift 中的 getter 和 setter 函数没有区别。但你是对的,使用 Objective-C 开发的人应该改用 layoutMarginsRelativeArrangement。官方文档:developer.apple.com/reference/uikit/uistackview/…
对于 Objective-C:stackView.layoutMargins = UIEdgeInsetsMake(0, 20, 0, 20); [stackView setLayoutMarginsRelativeArrangement:YES];
2019 年 2 月,午夜坐在办公室里——这样的答案给了我前进的力量。谢谢@tolpp
很好的解决方案!谢谢!
p
pkamb

我发现约束在堆栈视图中不起作用,或者它们看起来有些奇怪。

(例如,如果我将前导/尾随约束添加到图像堆栈视图上的选定内容,这也将前导添加到集合视图,但不添加尾随;肯定会发生冲突)。

https://i.stack.imgur.com/XH82C.png

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

Stack View > Size Inspector > Layout Margins > Fixed

注意:"Fixed" 选项以前称为 "Explicit",如屏幕截图所示。

然后添加您的填充:

https://i.stack.imgur.com/EvPGh.png


苹果隐藏的事情之一。我讨厌 Xcode 是好的、友好和简单的反面。谢谢
当我更改那些显式布局边距时,Xcode 不断崩溃。提交了一个错误,但他们回答说它是重复的。
这是我在 UI 中找不到的。将布局边距更改为显式以查看堆栈视图边距的字段。
仅供参考 XCode 9 现在将此称为“固定”而不是“显式”。
同样在 Xcode 9 中,取消选中文件检查器中的“使用安全区域布局指南”,在撰写本文时这仍然会在 IB 中引起很多问题,并坚持使用普通布局指南来解决您的约束。
W
William Kinaan

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

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

提示,您可以使用 Interface Builder 完全做到这一点。换句话说,不需要为它编写代码。


d
dorsz

对我有用的是向堆栈视图添加另一个 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)...

J
Jonathan Parham

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

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


W
William Hu

swift 3:您只需要通过以下方式设置偏移量:

firstView.leadingAnchor.constraint(equalTo: parentView.leadingAnchor, constant: 200).isActive = true

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


这将通过提供的常量移动整个堆栈。
D
Daniis1infiniteloop

将您的堆栈视图对齐设置为“中心”。之后,您可以为每个子视图赋予不同的前导和尾随。


A
Aiden Dixon

解决方案是在堆栈视图中有一个常规视图来保存您想要添加约束的任何视图,然后您可以为您的项目添加与堆栈视图中的视图相关的约束。这样,您的原始视图可以在堆栈视图中具有前导和尾随约束。

这可以在界面构建器中以编程方式完成。


i
infiniteLoop

这个问题已经有了很好的答案,不过有一个建议,使用 spacing 属性来设置视图之间的间距。对于第一个和最后一个视图,可以有两个选项,或者将 insets 设置为 @tolpp 建议的,或者添加约束附加到父级(stackview),并使用常量添加填充。


C
Crashalot

我们所做的是添加透明组件(例如,UIButton/UIView)作为 UIStackView 的第一个和最后一个子项。然后设置约束这些不可见子项的宽度来调整内边距。


A
Adrian

似乎解决方案非常简单。代替:

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

我刚刚写道:

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor, constant: 15).active = true

实际上,您的代码在 urscrollview 中为 uistackview 添加了前导,它不会在 uistackview 中为您的视图添加填充(如问题所述)
是的,但我不知道你是否可以添加填充,所以这对我有用。
作为第一个想法,您可以在原始 uistackview 中使用另一个 uistackview 并为其提供填充。然后将您的视图添加到这个新的 uistackview 中(您可以通过界面生成器完全做到这一点,无需为其编写代码)
是的,这会奏效。您可以添加为答案,我会接受。
S
Sergiu Todirascu

只需在堆栈视图的开头添加一个空视图(同时限制其宽度和/或高度):

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
    }
}

这不适用于所有填充模式,因为空视图的内在内容大小是空的。
你是对的。在我自己的项目中偶然发现了这一点。编辑答案。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅