Swift 4,UIStackViews不显示

时间:2018-08-23 23:09:41

标签: swift

我遇到的奇怪错误。

此代码:

    // Label 1
    let textLabel1 = UILabel()
    textLabel1.backgroundColor = UIColor.yellow
    textLabel1.text  = "Label1"
    textLabel1.textAlignment = .center

    // Label 2
    let textLabel2 = UILabel()
    textLabel2.backgroundColor = UIColor.blue
    textLabel2.text  = "Label2"
    textLabel2.textAlignment = .center

    // Label 3
    let textLabel3 = UILabel()
    textLabel3.backgroundColor = UIColor.green
    textLabel3.text  = "Label3"
    textLabel3.textAlignment = .center


    let h1StackView = UIStackView()
    h1StackView.axis = UILayoutConstraintAxis.horizontal
    h1StackView.distribution = .fillEqually
    h1StackView.alignment = UIStackViewAlignment.fill
    h1StackView.spacing = 0
    h1StackView.addArrangedSubview(textLabel3)
    h1StackView.addArrangedSubview(textLabel2)
    self.view.addSubview(h1StackView)

    let h2StackView = UIStackView()
    h2StackView.axis = UILayoutConstraintAxis.horizontal
    h2StackView.distribution = .fillEqually
    h2StackView.alignment = UIStackViewAlignment.fill
    h2StackView.spacing = 0
    h2StackView.addArrangedSubview(textLabel3)
    h2StackView.addArrangedSubview(textLabel1)
    self.view.addSubview(h2StackView)


    //Stack View
    let stackView = UIStackView(frame: CGRect(x: 0, y: pos.VERT_STACK_Y, width: pos.SCREEN_WIDTH, height: pos.VERT_STACK_HEIGHT))
    stackView.axis = UILayoutConstraintAxis.vertical
    stackView.distribution = .fillEqually
    stackView.alignment = UIStackViewAlignment.fill
    stackView.spacing = 0
    stackView.addArrangedSubview(h1StackView)
    stackView.addArrangedSubview(h2StackView)
    self.view.addSubview(stackView)

给出此视图: Buggy Image 1 Buggy Image 1

这几乎是正确的,但却是错误的,因为我不希望那条大蓝条,而是一半蓝色-一半绿色。

虽然对我来说有点奇怪...

如果我仅更改代码中的一个字符(将textLabel2更改为textLabel1):

(此):

    let h1StackView = UIStackView()
    h1StackView.axis = UILayoutConstraintAxis.horizontal
    h1StackView.distribution = .fillEqually
    h1StackView.alignment = UIStackViewAlignment.fill
    h1StackView.spacing = 0
    h1StackView.addArrangedSubview(textLabel3)
    h1StackView.addArrangedSubview(textLabel2)
    self.view.addSubview(h1StackView)

(为此):

    let h1StackView = UIStackView()
    h1StackView.axis = UILayoutConstraintAxis.horizontal
    h1StackView.distribution = .fillEqually
    h1StackView.alignment = UIStackViewAlignment.fill
    h1StackView.spacing = 0
    h1StackView.addArrangedSubview(textLabel3)
    h1StackView.addArrangedSubview(textLabel1)
    self.view.addSubview(h1StackView)

然后我得到这个视图:

Buggy Image 2 Buggy Image 2

似乎有两个问题,我也不能完全解决..有什么想法吗?我希望这是我的问题,而不是Swift / Xcode的问题。

(抱歉,没有足够的代表来嵌入图像)

2 个答案:

答案 0 :(得分:1)

主要问题在于单个实例一次只能在一个视图中的逻辑,因此首先,当您在两个水平stackViews中重复添加lbl3时,它出现在最后一个视图中(stack2),同样,当您重复添加1,3时,它们只显示在水平堆栈2内,因此要重复此操作,您必须创建另一个对象,如果您决定创建一个主堆栈来容纳2个水平堆栈,则注释这2个线

self.view.addSubview(h1StackView)
self.view.addSubview(h2StackView)

答案 1 :(得分:0)

arrangedSubViews是所有subviews的子集—

摘自UIView上的文档

  

父视图可以包含任意数量的子视图,但是每个子视图只有一个超级视图。

addSubView(_:)

中对此进行了扩展
  

视图只能有一个超级视图。如果视图已经具有超级视图并且该视图不是接收者,则此方法会在使接收者成为新的超级视图之前删除先前的超级视图。

因此,当您在此行中将textLabel3添加到h2StackView时:

h2StackView.addArrangedSubview(textLabel3)

您要隐式将其从h1StackView中删除