【问题标题】:How can I set the cornerRadius of a UIStackView?如何设置 UIStackView 的cornerRadius?
【发布时间】:2016-02-28 21:59:29
【问题描述】:

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

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

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

【问题讨论】:

  • 你能分享之前和之后的代码吗?如果我们有一段 sn-p 代码可供查看,会更容易提供帮助

标签: ios swift cornerradius uistackview


【解决方案1】:

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

【讨论】:

  • 或高于stackview
  • 为什么要把它放在stackview之上?那不会覆盖stackView的内容吗?
【解决方案2】:

在stackview的superview上添加cornerRadius并启用superview的clipsToBounds属性,这样子视图就被限制在superview的边界内。

【讨论】:

    【解决方案3】:

    你可以使用这样的扩展:

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

    【讨论】:

      【解决方案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)
          }
          }
      

      【讨论】:

        【解决方案5】:

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

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

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

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

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

        2. 将您想要的圆角半径添加到视图中。 (检查员,朝上)

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

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

        【讨论】:

          【解决方案6】:

          如果我设置它对我有用

          stackView.layer.cornerRadius=5

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

          在我的例子中,stackView 的 backgroundColor 负责内部视图的背景颜色,所以它适合我。

          【讨论】:

            猜你喜欢
            • 2019-04-05
            • 2015-08-15
            • 1970-01-01
            • 2016-01-18
            • 2013-06-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多