【问题标题】:Determining when a view created programmatically did appear on screen确定以编程方式创建的视图何时出现在屏幕上
【发布时间】: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。即便如此,是否有办法确定以编程方式创建的视图何时出现在屏幕上?

标签: swift uiview


【解决方案1】:

我认为没有一种规范的方法可以知道单个视图何时出现在屏幕上。您可能可以使用draw 方法(这很hacky),但堆栈视图本身不会绘制任何东西,所以我认为这不起作用。

您可能可以使用UIViewController.viewDidLayoutSubviews,但您可能需要将堆栈视图添加到根视图才能使用。

无论如何,将UIStackView 添加为UITextField 的子视图是不好的做法。您可能希望将其添加到父视图中。是的,使用 AutoLayout 是这里的方法。让框架处理布局,不要尝试使用转换。

【讨论】:

    猜你喜欢
    • 2010-10-20
    • 1970-01-01
    • 2014-04-02
    • 2012-11-05
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多