我遇到的奇怪错误。
此代码:
// 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
这几乎是正确的,但却是错误的,因为我不希望那条大蓝条,而是一半蓝色-一半绿色。
虽然对我来说有点奇怪...
如果我仅更改代码中的一个字符(将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)
然后我得到这个视图:
似乎有两个问题,我也不能完全解决..有什么想法吗?我希望这是我的问题,而不是Swift / Xcode的问题。
(抱歉,没有足够的代表来嵌入图像)
答案 0 :(得分:1)
主要问题在于单个实例一次只能在一个视图中的逻辑,因此首先,当您在两个水平stackViews中重复添加lbl3时,它出现在最后一个视图中(stack2),同样,当您重复添加1,3时,它们只显示在水平堆栈2内,因此要重复此操作,您必须创建另一个对象,如果您决定创建一个主堆栈来容纳2个水平堆栈,则注释这2个线
self.view.addSubview(h1StackView)
self.view.addSubview(h2StackView)
答案 1 :(得分:0)
arrangedSubViews
是所有subviews
的子集—
摘自UIView
上的文档
中对此进行了扩展父视图可以包含任意数量的子视图,但是每个子视图只有一个超级视图。
视图只能有一个超级视图。如果视图已经具有超级视图并且该视图不是接收者,则此方法会在使接收者成为新的超级视图之前删除先前的超级视图。
因此,当您在此行中将textLabel3
添加到h2StackView
时:
h2StackView.addArrangedSubview(textLabel3)
您要隐式将其从h1StackView
中删除