swift:在ViewController中返回后显示动画

时间:2018-07-31 04:54:32

标签: ios swift

我有第一ViewController和第二ViewController。从第二ViewController返回第一ViewController之后,我想在第一ViewController中显示按钮。

要返回,我使用以下代码:

self.dismiss(animated: true, completion: nil)

此代码显示第一个ViewController中的按钮

@IBOutlet weak var infoButton: UIButton!
@IBOutlet weak var nextButton: UIButton!

@IBOutlet weak var infoButtonTopConstraint: NSLayoutConstraint!
@IBOutlet weak var nextButtonBottomConstraint: NSLayoutConstraint!
@IBOutlet weak var infoButtonHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var nextButtonHeightConstraint: NSLayoutConstraint!

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)

    showButtonAnimation()
    //animaton()
}

func showButtonAnimation() {

    self.infoButtonTopConstraint.constant += self.infoButtonHeightConstraint.constant
    self.nextButtonBottomConstraint.constant -= self.nextButtonHeightConstraint.constant

    UIView.animate(withDuration: 1.0, delay: 0.0,
                   options: [], animations: {
                    self.view.layoutIfNeeded()

    })
}

但是当我从第二个ViewController返回时,按钮没有显示。

4 个答案:

答案 0 :(得分:1)

替换此

func showButtonAnimation() {
    self.view.layoutIfNeeded()
    UIView.animate(withDuration: 1.0, delay: 0.0,
                       options: [], animations: {
        self.infoButtonTopConstraint.constant += self.infoButtonHeightConstraint.constant
        self.nextButtonBottomConstraint.constant -= self.nextButtonHeightConstraint.constant
        self.view.layoutIfNeeded()

    })
}

编辑1

viewWillAppear未得到调用的原因:您将第二个viewController表示为overCurrentContext modalPresentationStyle

只需将overCurrentContext替换为fullScreen即可。

答案 1 :(得分:0)

每次调用viewWillAppear时,请记住该视图未加载到主视图中,因此动画将无法正常工作。您应该使用viewDidAppear

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        showButtonAnimation()
    }

并且在动画方法中进行如下更新,因为您更改了需要退出的动画块内的约束值。

func showButtonAnimation() {
    self.infoButtonTopConstraint.constant += self.infoButtonHeightConstraint.constant
    self.nextButtonBottomConstraint.constant -= self.nextButtonHeightConstraint.constant
    UIView.animate(withDuration: 1.0, delay: 0.0,
                       options: [], animations: {

        self.view.layoutIfNeeded()

    })
}

答案 2 :(得分:0)

我已经尝试过您的代码,并且它是第一次工作,但是问题可能出在每次按钮约束的常量值增加时。

所以它们可能隐藏在您的主视图后面。

解决方案:-您可以标记并在动画完成后更改其值。

现在,当您从第二个控制器回来时,您必须在viewWillAppear中检查按钮是否可见,如果按钮可见,则不必调用 showButtonAnimation 方法。

单击

可以查看按钮在当前屏幕中的位置。

https://i.stack.imgur.com/cwpn1.png

按钮查看UI层次结构。

希望这可以解决您的问题。

答案 3 :(得分:-1)

您可以在second viewController中添加一个委托。喜欢:

protocol SecondViewControllerDelegate {
    func vcDismissed()
}

Class SecondViewController : UIViewController {
    weak var delegate: SecondViewControllerDelegate

    .....
    //Where you are dismissing your viewController, call the delegate method in completion. 

    func someMethod() {
        self.dismiss(animated: true, completion: {
            self.delegate.vcDismissed()            
        })
    }
}

现在在您的FirstViewController中,遵循协议并实施如下方法:

extension FirstViewController: SecondViewControllerDelegate {
    func vcDismissed() {
        //Here call your showButton method
        self.showButton()
    }
}

在创建要显示它的secondViewController实例时,请不要忘记设置委托。喜欢

objSecondViewController.delegate = self

希望这会有所帮助。对于任何查询,请随时发表评论。