如何改变UIStackView的背景颜色?

Luk*_*ong 135 ios swift uistackview

我试图UIStackView在Storyboard检查器中将背景从清除更改为白色,但在模拟时,堆栈视图的背景颜色仍然具有清晰的颜色.
如何更改背景颜色UIStackView

Dha*_*esh 248

你不能这样做 - UIStackView是一个非绘图视图,意味着 drawRect()永远不会调用它,它的背景颜色会被忽略.如果您非常想要背景颜色,请考虑将堆栈视图放在另一个视图中UIView,并为该视图提供背景颜色.

来自HERE的参考资料.

  • 这是**非常错误的**.这是一个罕见的案例,保罗关于HackingWithSwift的文章**完全不正确**.你只需添加另一个视图(这不是******排列的**视图之一),这就是答案. (9认同)
  • 这是一篇解释它的文章,它是微不足道的:https://useyourloaf.com/blog/stack-view-background-color/ (8认同)
  • 那么 stackview 有什么用呢,我们不能简单地将我们的视图添加到另一个视图中,并给予它水平或垂直对齐的约束,这样就完全避免了 stackview 。在 stackview 中有视图,在 UIView 中有 stackview,然后在我们的组件中添加这个 UIView,这不是很荒谬吗? (3认同)
  • 在iOS14中,您可以设置背景颜色https://useyourloaf.com/blog/stack-view-background-color-in-ios-14/ (3认同)

Arb*_*tur 45

我是这样做的:

@IBDesignable
class StackView: UIStackView {
   @IBInspectable private var color: UIColor?
    override var backgroundColor: UIColor? {
        get { return color }
        set {
            color = newValue
            self.setNeedsLayout() // EDIT 2017-02-03 thank you @BruceLiu
        }
    }

    private lazy var backgroundLayer: CAShapeLayer = {
        let layer = CAShapeLayer()
        self.layer.insertSublayer(layer, at: 0)
        return layer
    }()
    override func layoutSubviews() {
        super.layoutSubviews()
        backgroundLayer.path = UIBezierPath(rect: self.bounds).cgPath
        backgroundLayer.fillColor = self.backgroundColor?.cgColor
    }
}
Run Code Online (Sandbox Code Playgroud)

奇迹般有效


Mar*_*rný 29

UIStackView是一个非呈现元素,因此,它不会在屏幕上绘制.这意味着改变backgroundColor基本上什么都不做.如果要更改背景颜色,只需将其添加UIView为子视图(未排列),如下所示:

extension UIStackView {

    func addBackground(color: UIColor) {
        let subview = UIView(frame: bounds)
        subview.backgroundColor = color
        subview.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        insertSubview(subview, at: 0)
    }

}
Run Code Online (Sandbox Code Playgroud)


Mon*_*art 9

也许最简单,更易读,更少hacky的方法是嵌入UIStackViewUIView视图中并将背景颜色设置为视图.

并且不要忘记在这两个视图之间正确配置自动布局约束... ;-)

  • 是的,但其中的乐趣在哪里?:-) (3认同)

Mic*_*ong 9

Pitiphong是正确的,要获得带有背景颜色的stackview,请执行以下操作...

  let bg = UIView(frame: stackView.bounds)
  bg.autoresizingMask = [.flexibleWidth, .flexibleHeight]
  bg.backgroundColor = UIColor.red

  stackView.insertSubview(bg, at: 0)
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个stackview,其内容将被放置在红色背景上.

要向stackview添加填充以使内容不与边缘齐平,请在代码中或故事板上添加以下内容...

  stackView.isLayoutMarginsRelativeArrangement = true
  stackView.layoutMargins = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
Run Code Online (Sandbox Code Playgroud)

  • 我需要使用stackView.insertSubview(bg,belowSubview:stackView.arrangedSubviews [0])否则将彩色视图放在堆栈顶部. (2认同)

Pit*_*ont 8

TL; DR:执行此操作的官方方法是使用addSubview:方法向堆栈视图添加空视图,并设置添加的视图背景.

解释:UIStackView是一个特殊的UIView子类,只做布局而不是绘图.它的许多属性都不会像往常那样起作用.由于UIStackView将仅布置其排列的子视图,这意味着您可以简单地将UIView添加到addSubview:方法,设置其约束和背景颜色.这是实现WWDC会话引用的官方方式


Cri*_*sei 8

值得指出的是,从iOS 14开始, UIStackViews 会渲染背景颜色。您可以使用 Background 属性从 Storyboard 设置 UIStackView 的背景。

在此处输入图片说明

或在代码中:

if #available(iOS 14.0, *) {
    stackView.backgroundColor = .green
} else {
    // Fallback for older versions of iOS
}
Run Code Online (Sandbox Code Playgroud)