如何基于另一个视图为视图设置动画

时间:2016-04-02 04:12:44

标签: xcode swift animation constraints uiviewanimation

中间锁定比我动画中的顶部窗格更快地向上动画。如何设置中锁的动画,使其沿顶部窗格向上移动?更具体地说,我希望中间锁定中心在顶部窗格向上和离开屏幕时始终与顶部窗格对齐。

这是我目前的代码,lockBorderlockKeyhole是所谓的“中间锁定”,与topLock相比向上移动得太快了:

@IBOutlet var topLock: UIImageView!
@IBOutlet var bottomLock: UIImageView!
@IBOutlet var lockBorder: UIImageView!
@IBOutlet var lockKeyhole: UIImageView!


override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    openLock()

}


func openLock() {

    UIView.animateWithDuration(0.5, delay: 1.0, options: [], animations: {
        self.lockKeyhole.transform = CGAffineTransformMakeRotation(CGFloat(3.14))
        }, completion: { _ in

            UIView.animateWithDuration(0.6, delay: 0.2, options: [], animations: {

                var topFrame = self.topLock.frame
                topFrame.origin.y -= topFrame.size.height

                var bottomFrame = self.bottomLock.frame
                bottomFrame.origin.y += bottomFrame.size.height


                var lockBorderFrame = self.lockBorder.frame
                lockBorderFrame.origin.y -= self.view.frame.height

                var lockKeyholeFrame = self.lockKeyhole.frame
                lockKeyholeFrame.origin.y -= self.view.frame.height

                self.topLock.frame = topFrame
                self.bottomLock.frame = bottomFrame
                self.lockKeyhole.frame = lockKeyholeFrame
                self.lockBorder.frame = lockBorderFrame

                }, completion: { finished in

            })
        })
}

1 个答案:

答案 0 :(得分:0)

您正在topFrame.origin.y调整topFrame.size.height,但您正在调整lockBorderFrame.origin.ylockKeyholeFrame.origin.y self.view.frame.height。我们可以推断这些调整是不同的数额。我假设topFrame.size.heightself.view.size.height的一半。由于您将锁定视图移动了移动距离的两倍topLock,并且两次调整都在相同的0.6秒间隔内发生,因此锁定视图的移动速度提高了两倍。

我假设您想要在屏幕上一直设置锁定视图的动画,因此仅用topFrame.size.height移动它们是不够的。这将使锁的下半部分可见。您需要移动锁定视图,使其底边位于self.view的上边缘。

这意味着您需要将lockBorder.frame.origin.y设置为lockBorder.frame.size.height的否定值。它会移动lockBorder.frame.size.height + lockBorder.frame.origin.y的总距离,恰好等于lockBorder.frame.maxY

我认为lockBorder至少与lockKeyhole一样大,所以如果我们按lockBorder.frame.maxY移动所有视图,它们都会在屏幕外显示。由于我们将它们移动到相同的距离,所有视图都会一起移动。

另请注意,如果您在故事板中使用约束,那么只要您对视图层次结构执行几乎任何其他操作,这些视图就会快速恢复到其原始位置。所以你应该在动画结束后立即将它们从超级视图中删除,除非你以其他方式隐藏它们(比如从视图层次结构中删除它们的超级视图)。

顺便说一句,标准库为您定义M_PI

func openLock() {
    UIView.animateWithDuration(0.5, delay: 1.0, options: [], animations: {
        self.lockKeyhole.transform = CGAffineTransformMakeRotation(CGFloat(M_PI))
        }, completion: { _ in
            UIView.animateWithDuration(0.6, delay: 0.2, options: [], animations: {
                let yDelta = self.lockBorder.frame.maxY

                self.topLock.center.y -= yDelta
                self.lockKeyhole.center.y -= yDelta
                self.lockBorder.center.y -= yDelta
                self.bottomLock.center.y += yDelta
                }, completion: { _ in
                    self.topLock.removeFromSuperview()
                    self.lockKeyhole.removeFromSuperview()
                    self.lockBorder.removeFromSuperview()
                    self.bottomLock.removeFromSuperview()
            })
    })
}