Как анимировать элементы UIStackView, созданного в отдельной функции - PullRequest
0 голосов
/ 09 июня 2019

Я пытаюсь анимировать вид стека и его элементы после нажатия кнопки UIB. проблема в том, что представление стека создается внутри функции, которая вызывается в viewdidload.

Поскольку представление стека создается внутри функции, я не могу вызвать его внутри функции, управляющей анимацией ... Я думаю, что я делаю что-то не так ...

моя функция создания стека

    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 голосов
/ 09 июня 2019

В дополнение к ответу Марсио, вы также можете опционально объявить 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, вы должны называть переменные в camelcase (stackView)

0 голосов
/ 09 июня 2019

Вы можете вернуть стековое представление из вашей функции и сохранить ссылку на него как на переменную экземпляра. Таким образом, вы можете использовать его позже.

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...