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

Xcode 如何基于另一个视图设置视图动画,xcode,swift,animation,constraints,uiviewanimation,Xcode,Swift,Animation,Constraints,Uiviewanimation,中间的锁动画向上的速度比我的动画中的顶部窗格快。如何设置中间锁的动画,使其沿着顶部窗格向上移动?更具体地说,我希望中间的锁中心在向上和离开屏幕时始终与顶部窗格底部对齐 这是我目前拥有的代码,lockBorder和lockKeyhole是所谓的“中间锁”,与topLock相比向上移动太快: @IBOutlet var topLock: UIImageView! @IBOutlet var bottomLock: UIImageView! @IBOutlet var lockBorder: UIIm

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

这是我目前拥有的代码,
lockBorder
lockKeyhole
是所谓的“中间锁”,与
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

            })
        })
}

您正在通过
topFrame.size.height
调整
topFrame.origin.y
,但是您正在通过
self.view.frame.height
调整
lockBorderFrame.origin.y
lockKeyholeFrame.origin.y
。我们可以推断,这些调整是不同的数额。我假设
topFrame.size.height
self.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
移动所有视图,它们都将离开屏幕。因为我们移动它们的距离相同,所以所有的视图都会一起移动

还请注意,如果在情节提要中使用约束,则在对视图层次结构执行几乎任何其他操作后,这些视图将立即捕捉回其原始位置。因此,您可能应该在动画完成后立即将它们从超级视图中删除,除非您以其他方式隐藏它们(例如从视图层次中删除它们的超级视图)

顺便说一下,标准库为您定义了
mpi

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()
            })
    })
}

您正在通过
topFrame.size.height
调整
topFrame.origin.y
,但是您正在通过
self.view.frame.height
调整
lockBorderFrame.origin.y
lockKeyholeFrame.origin.y
。我们可以推断,这些调整是不同的数额。我假设
topFrame.size.height
self.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
移动所有视图,它们都将离开屏幕。因为我们移动它们的距离相同,所以所有的视图都会一起移动

还请注意,如果在情节提要中使用约束,则在对视图层次结构执行几乎任何其他操作后,这些视图将立即捕捉回其原始位置。因此,您可能应该在动画完成后立即将它们从超级视图中删除,除非您以其他方式隐藏它们(例如从视图层次中删除它们的超级视图)

顺便说一下,标准库为您定义了
mpi

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()
            })
    })
}

你为什么不把它作为上半部分的子视图?@jtbandes你能告诉我你会怎么做吗?我现在拥有故事板中的所有内容。仅仅通过查看代码,我很难理解它是如何设置的。我的建议是,与其将
topLock
lockKeyhole
/
lockBorder
作为同级视图,不如将它们作为
topLock
的子视图。然后你只需移动
topLock
,其他人也会随之移动。@jtbandes我会根据你的评论看看我能做些什么。只是解释一下,基本上有4个图像,你可以通过查看上面的IBOutlet来确认这一点,这些图像的设置与视频的开始方式完全相同。我为什么不把它作为上半场的子视图?@jtbandes你能告诉我你会怎么做吗?我现在拥有故事板中的所有内容。仅仅通过查看代码,我很难理解它是如何设置的。我的建议是,与其将
topLock
lockKeyhole
/
lockBorder
作为同级视图,不如将它们作为
topLock
的子视图。然后你只需移动
topLock
,其他人也会随之移动。@jtbandes我会根据你的评论看看我能做些什么。只是解释一下,基本上有4个图像,你可以通过查看上面的IBOutlet来确认这一点,这些图像的设置与视频的开始方式完全相同。真管用,谢谢!快速提问,我通常会让动画正常工作,但有时当我想到