导航后,ViewController会丢失动画位置

时间:2016-06-29 03:55:07

标签: swift uiviewanimationtransition

我想要一个视图从左侧出现并消失(取决于它是否为用户提供了一些有用的信息)。

我想查看使用约束进行定位,因此我需要从故事板创建它。

在此代码段中,应该移开视图,以便何时显示代码。 但是:当我转到下一个VC时,我可以看到视图再次出现在其原始位置,当从VC返回到初始VC时,它实际上恢复了原始位置。

我拯救了"状态"变量中的视图,使其在VC的各个生命周期中出现/消失,但没有任何帮助。

实现这一目标的最佳方法是什么?

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var myView: UIView!
    var boxIsVisible = false

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    var originalX:CGFloat = 0.0

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        originalX = self.myView.frame.origin.x
        if boxIsVisible == false {
           self.myView.center.x -= 200
        }
    }


    @IBAction func slideInAction(sender: AnyObject) {
        UIView.animateWithDuration(3.0, animations: {
            self.myView.center.x = self.originalX
                 self.boxIsVisible = true

        })
}

    @IBAction func slideOutAction(sender: AnyObject) {
        UIView.animateWithDuration(3.0, animations: {
            self.myView.center.x = -200
                 self.boxIsVisible = false
        })
    }
}

1 个答案:

答案 0 :(得分:1)

更新前导约束而不是视图的位置,因为您使用自动布局。

class ViewController: UIViewController {
    @IBOutlet weak var myView: UIView!
    var boxIsVisible = false
    @IBOutlet weak var leadingConstraint: NSLayoutConstraint!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        if boxIsVisible == false {
            leadingConstraint.constant = -myView.frame.width
        }
    }

    @IBAction func slideInAction(sender: AnyObject) {
        UIView.animateWithDuration(3.0, animations: {
            self.leadingConstraint.constant = -50
            self.view.layoutIfNeeded()
            self.boxIsVisible = true
        })
    }

    @IBAction func slideOutAction(sender: AnyObject) {
        UIView.animateWithDuration(3.0, animations: {
            self.leadingConstraint.constant = -self.myView.frame.width
            self.view.layoutIfNeeded()
            self.boxIsVisible = false
        })
    }
}