【发布时间】:2021-07-15 04:45:29
【问题描述】:
我有一个 textField,当点击它时,会弹出一个以编程方式创建的垂直 stackView。 stackView 是 textField 的子项。 textField.addSubview(stackView) 将 stackView 的原点放在 textField 的原点。我希望将 stackView 的原点垂直向上移动一个等于 stackView 高度的量。如果我这样做:
func textFieldDidBeginEditing(_ textField: UITextField) {
stackView = UIStackView() // var stackView: UIStackView!
stackView.axis = .vertical
stackView.alignment = .leading
stackView.distribution = .fillEqually
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.spacing = 0
stackView.backgroundColor = .white
stackView.layer.borderWidth = 1
stackView.layer.borderColor = UIColor.gray.cgColor
for title in titleList {
stackView.addArrangedSubview(createButton(title))
}
textField.addSubview(stackView)
stackView.transform = CGAffineTransform(translationX: 0, y: -stackView.frame.height)
}
它不起作用。 stackView 的原点保留在 textField 的原点。但是如果我使用一个常量:
textField.addSubview(stackView)
stackView.transform = CGAffineTransform(translationX: 0, y: -144)
它有效。我已经通过调试确认stackView.frame.height 在执行 CGAffineTransform 时为 0。如果我在 exited 函数后检查它的值,我确实看到它的高度是 144。这意味着 stackView 实际上还没有出现在 within 函数中。
有没有办法捕捉以编程方式创建的 stackView 何时出现(有点像 viewDidAppear(_:) 的工作方式),以便我可以设置它在屏幕上的位置?
【问题讨论】:
-
好的,我刚刚发现我可以通过以下方式完成我需要的工作:
stackView.bottomAnchor.constraint(equalTo: textField.bottomAnchor).isActive = true。即便如此,是否有办法确定以编程方式创建的视图何时出现在屏幕上?