我该如何设置UIStackView的cornerRadius?

32

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

在旧版本中,我创建了一个UIView,其中包含两个UITextFields,并设置其layer.cornerRadius属性。

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


你能分享一下代码改动前后的版本吗?如果我们有一小段能看的代码片段,那么帮助你就更容易些了。 - CStreel
6个回答

78

UIStackView 仅管理其排列视图的位置和大小,cornerRadius 没有影响。尝试在 stackView 下方添加自定义视图并设置其 cornerRadius。


5
在堆栈视图之上 - Peter DeWeese
为什么要将它放在stackView之上?那不会覆盖stackView的内容吗? - ScottyBlades

13

您可以使用这样的扩展:

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

12
在 stackview 的父视图上添加 cornerRadius 属性,并启用父视图的 clipsToBounds 属性,以便子视图被限制在父视图的边界内。

4
如果您想为StackView提供背景颜色、圆角和阴影:
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和border width:

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

1
如果你在Interface Builder中,你可以执行以下操作:
  1. 将你的StackView嵌入到一个View中。(菜单->编辑->嵌入->视图)

  2. 添加约束使得StackView恰好限制在新的父视图中。

要小心!xCode非常容易误导人。如果你看到左侧的Navigator显示了你的约束,你可能会认为“bottom = stackView.bottom”意味着它们完全对齐。但不是这样的!默认情况下,xCode使用标准约束。你可以在xib图形化显示区域中看到它,但它很微妙且令人困惑。查看右侧的Inspector以获取约束的详细信息,你会发现常数是“Standard”。将其更改为0!

  1. 在View中勾选clipToBounds。(Inspector向下)

  2. 向View中添加所需的圆角半径。(Inspector向上)

这里使用 subView 的答案在运行时动态调整大小的 StackView 上存在问题。如果您使用一个父视图(View)并将其与 StackView 连接的约束,这将不成问题。此外,在特定布局中,如果背景颜色是一个因素,请注意父视图 View 中的背景颜色。此外,正如其他答案所提到的那样,请注意阴影。

1

如果我设置,它对我有效。

stackView.layer.cornerRadius=5

只要将子视图的backgroundColor设置为.clear即可。 在我的情况下,stackView的backgroundColor负责内部视图的背景颜色,所以它适合我。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接