如何为在单独函数中创建的UIStackView的元素设置动画

时间:2019-06-09 14:12:14

标签: swift uistackview

我正在尝试在按下UIButton时对stackview及其元素进行动画处理。问题在于,堆栈视图是在viewdidload中调用的函数内部创建的。

由于stackview是在函数内部创建的,因此无法在管理动画的函数内调用它...我认为我做错了...

我的stackview创建功能

    fileprivate func variableContent() {
            let stackviewButtons = UIStackView(arrangedSubviews: [registerSerialNumberButton, dothislaterButton])
            stackviewButtons.axis = .vertical
            stackviewButtons.alignment = .fill
            stackviewButtons.spacing = 10

            let stackview = UIStackView(arrangedSubviews: [registerTitlelabel, registerdescriptionLabel, serialnumberInput, stackviewButtons])
            stackview.axis = .vertical
            stackview.spacing = 20
            stackview.setCustomSpacing(40, after: registerdescriptionLabel)
            stackview.setCustomSpacing(100, after: serialnumberInput)
            view.addSubview(stackview)
            stackview.anchor(top: nil, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 0, paddingLeft: 20, paddingBottom: 0, paddingRight: 20, width: 0, height: 0)
            stackview.centerXInSuperview()
            stackview.centerYInSuperview()
        }

viewdidload

    override func viewDidLoad() {
        variableContent()
    }

2 个答案:

答案 0 :(得分:0)

您可以从函数中返回堆栈视图,并保留对它的引用作为实例变量。这样一来,您以后就可以重用它。

class Controller: UIViewController {
    var stackView: UIStackView!
    fileprivate func variableContent() -> UIStackView {
        let stackviewButtons = UIStackView(arrangedSubviews: [registerSerialNumberButton, dothislaterButton])
        stackviewButtons.axis = .vertical
        stackviewButtons.alignment = .fill
        stackviewButtons.spacing = 10

        let stackview = UIStackView(arrangedSubviews: [registerTitlelabel, registerdescriptionLabel, serialnumberInput, stackviewButtons])
        stackview.axis = .vertical
        stackview.spacing = 20
        stackview.setCustomSpacing(40, after: registerdescriptionLabel)
        stackview.setCustomSpacing(100, after: serialnumberInput)
        view.addSubview(stackview)
        stackview.anchor(top: nil, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 0, paddingLeft: 20, paddingBottom: 0, paddingRight: 20, width: 0, height: 0)
        stackview.centerXInSuperview()
        stackview.centerYInSuperview()
        return stackview
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.stackView = variableContent()
    }
}

另一种选择是给它一个标签(stackview.tag = 42)  并使用self.view.viewWithTag(42)

恢复

答案 1 :(得分:0)

除了Marcio的答案,您还可以选择声明stackView并在函数中进行设置:

class Controller: UIViewController {
    var stackview: UIStackView?
    fileprivate func variableContent() {
            let stackviewButtons = UIStackView(arrangedSubviews: [registerSerialNumberButton, dothislaterButton])
            stackviewButtons.axis = .vertical
            stackviewButtons.alignment = .fill
            stackviewButtons.spacing = 10

            self.stackview = UIStackView(arrangedSubviews: [registerTitlelabel, registerdescriptionLabel, serialnumberInput, stackviewButtons])
            stackview.axis = .vertical
            stackview.spacing = 20
            stackview.setCustomSpacing(40, after: registerdescriptionLabel)
            stackview.setCustomSpacing(100, after: serialnumberInput)
            view.addSubview(stackview)
            stackview.anchor(top: nil, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 0, paddingLeft: 20, paddingBottom: 0, paddingRight: 20, width: 0, height: 0)
            stackview.centerXInSuperview()
            stackview.centerYInSuperview()
    }

    // Whatever your animating function is:
    func animateStackView() {
    guard let stackview = self.stackview else { return }
    // You now have access to your stackView for the rest of this function.
    }
}

注意:为了与您的问题保持一致,我在代码中将UIStackView的名称保留为stackview,但是根据Swift的命名约定,您应该命名变量驼峰(stackView