如何设置UIStackView的cornerRadius?

时间:2015-11-25 23:00:24

标签: ios swift cornerradius uistackview

我正在更新我的应用以使用UIStackViews,现在大多数人都应该更新到iOS 9.

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

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

6 个答案:

答案 0 :(得分:45)

$ gulp [00:20:40] Using gulpfile /srv/http/sl/gulpfile.js [00:20:40] Starting 'default'... [00:20:40] Starting 'compass'... [00:20:40] Finished 'default' after 14 ms [00:20:40] Nothing to compile. If you're trying to start a new project, you have left off the directory argument. Run "compass -h" to get help. [00:20:40] gulp-notify: [Laravel Elixir] Compass Compilation Failed!: Compass failed { [Error: Compass failed] message: 'Compass failed', showStack: false, showProperties: true, plugin: 'gulp-compass', __safety: { toString: [Function: bound ] } } [00:20:40] 'compass' errored after 414 ms [00:20:40] Error in plugin 'gulp-compass' Message: Compass failed [00:20:40] Error in plugin 'run-sequence' Message: An error occured in task 'compass'. 只管理其排列视图的位置和大小,cornerRadius无效。尝试在stackView下面添加一个自定义视图,并设置它的cornerRadius。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

如果要为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)
    }
    }

答案 3 :(得分:1)

您可以使用以下扩展名:

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 :(得分:0)

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

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

  2. 添加约束,以便将 StackView 精确地约束到新的 superView。

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

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

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

如果您的 StackView 在运行时动态调整大小,那么这里使用 subView 的答案是有问题的。如果您使用带有连接到 StackView 的约束的超级视图 (View),这不是问题。

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

答案 5 :(得分:0)

如果我设置了,它对我有用

stackView.layer.cornerRadius=5

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

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