30

我正在更新我的应用程序以使用 UIStackViews,现在大多数人应该已经更新到 iOS 9。

在旧版本中,我制作了一个由两个 UITextField 组成的 UIView,并设置了它的 layer.cornerRadius 属性。

在新版本中,我创建了一个由相同的两个 UITextField 组成的 UIStackView,而不是 UIView。当我尝试设置它的 layer.cornerRadius 属性时,似乎什么也没发生。该文档似乎没有任何有用/相关的信息。

4

6 回答 6

75

UIStackView只管理其排列视图的位置和大小,cornerRadius 没有任何作用。尝试在stackView下方添加一个自定义视图并设置它的cornerRadius。

于 2015-11-26T01:09:21.710 回答
12

在 stackview 的 superview 上添加cornerRadius 并启用 superview 的 clipsToBounds 属性,以便子视图被限制在 superview 的范围内。

于 2018-05-24T06:44:40.547 回答
10

您可以使用这样的扩展:

extension UIStackView {
    func customize(backgroundColor: UIColor = .clear, radiusSize: CGFloat = 0) {
        let subView = UIView(frame: bounds)
        subView.backgroundColor = backgroundColor
        subView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        insertSubview(subView, at: 0)

        subView.layer.cornerRadius = radiusSize
        subView.layer.masksToBounds = true
        subView.clipsToBounds = true
    }
}
于 2019-06-09T21:35:55.637 回答
4

如果要为 StackView 提供 backgroundColor、CornerRadius 和 Shadow:

extension UIStackView {
func insertCustomizedViewIntoStack(background: UIColor, cornerRadius: CGFloat, shadowColor: CGColor, shadowOpacity: Float, shadowRadius: CGFloat) {
        let subView = UIView(frame: bounds)
        subView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        subView.layer.cornerRadius = cornerRadius
        subView.backgroundColor = background
        subView.layer.shadowColor = shadowColor
        subView.layer.shadowOpacity = shadowOpacity
        subView.layer.shadowOffset = .zero
        subView.layer.shadowRadius = shadowRadius
        insertSubview(subView, at: 0)
    }
}

如果要为 StackView 提供 backgroundColor、CornerRadius、borderColor 和边框宽度:

extension UIStackView {
     func insertViewIntoStack(background: UIColor, cornerRadius: CGFloat, borderColor: CGColor, borderWidth: CGFloat) {
        let subView = UIView(frame: bounds)
        subView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        subView.layer.cornerRadius = cornerRadius
        subView.backgroundColor = background
        subView.layer.borderColor = borderColor
        subView.layer.borderWidth = borderWidth
        insertSubview(subView, at: 0)
    }
    }
于 2020-03-13T13:13:20.860 回答
1

如果您在 Interface Builder 中,则可以执行以下操作:

  1. 将您的 StackView 嵌入到视图中。(菜单 -> 编辑器 -> 嵌入 -> 视图)

  2. 添加约束,以便 StackView 被完全约束到新的 superView。

当心!xCode 非常具有误导性,因为如果您查看显示约束的导航器(左侧),您可以认为“bottom = stackView.bottom”意味着它们完全对齐。但不是!xCode 默认使用标准约束。您在显示中看到它以图形方式显示您的 xib,但它很微妙且令人困惑。查看 Inspector(右侧),其中包含约束的详细信息,您将看到常量为“Standard”。将其更改为0!

  1. 选中视图中的 clipToBounds。(检查员,朝向底部)

  2. 将所需的角半径添加到视图。(检查员,向上)

如果您的 StackView 在运行时动态调整大小,则此处使用 subView 的答案是有问题的。如果您使用具有将其连接到 StackView 的约束的超级视图(视图),这不是问题。

如果这是您正在执行的特定布局中的一个因素,还请注意您的超级视图视图中的背景颜色。还有影子,正如此处其他答案中提到的那样。

于 2021-01-10T20:48:34.203 回答
1

如果我说,它对我有用

stackView.layer.cornerRadius=5

只要将子视图的 backgroundColor 设置为 .clear

在我的情况下,stackView 的 backgroundColor 负责内部视图的背景颜色,所以它适合我。

于 2021-02-11T22:15:32.023 回答