视图框架的UIView.animate问题

时间:2017-09-28 15:21:16

标签: ios swift animation uiview

我正在努力制作动画。这就是发生的事情:video

背卡应该与视频开头做同样的动画,但它做了一个完全不同的事情。我在动画开始时检查了UIView.frame,它与第一次卡进入时相同,但显然出现了问题......以下是代码:

func cardIn() {
    let xPosition = (self.darkCardView?.frame.origin.x)! - 300
    let yPosition = (self.darkCardView?.frame.origin.y)!

    self.initialPos = self.darkCardView.frame

    let height = self.darkCardView?.frame.size.height
    let width = self.darkCardView?.frame.size.width

    self.darkCardView?.transform = (self.darkCardImageView?.transform.rotated(by: CGFloat(Double.pi/4)))!

    UIView.animate(withDuration: 1.1, animations: {
        self.darkCardView?.frame = CGRect(x: xPosition, y: yPosition, width: width!, height: height!)
        self.darkCardView?.transform = (self.darkCardImageView?.transform.rotated(by: CGFloat(0)))!
    })
}

func cardOut() {
    let xPosition = (self.darkCardView?.frame.origin.x)! - 600
    let yPosition = (self.darkCardView?.frame.origin.y)!

    let height = self.darkCardView?.frame.size.height
    let width = self.darkCardView?.frame.size.width

    self.darkCardView?.transform = (self.darkCardImageView?.transform.rotated(by: CGFloat(0)))!

    UIView.animate(withDuration: 1.0, delay: 0, options: .allowAnimatedContent, animations: {
        self.darkCardView?.frame = CGRect(x: xPosition, y: yPosition, width: width!, height: height!)
        self.darkCardView?.transform = (self.darkCardImageView?.transform.rotated(by: CGFloat(-Double.pi/4)))!
    }) { (true) in
        self.darkCardView?.transform = (self.darkCardImageView?.transform.rotated(by: CGFloat(0)))!
        self.darkCardView?.frame = self.initialPos

        self.cardIn()
    }
}

有人知道在调用 cardOut 函数后,如何在视频开头重复播放相同的动画?

3 个答案:

答案 0 :(得分:0)

鉴于我们不知道您在何处/何时调用上述两项功能,我只能猜测发生了什么。

所以你有一个动画和动画输出,但重置功能怎么样?

时间轴: 动画卡片。 ... 最终为卡片制作动画 ... 将卡位置重置为屏幕右侧(第一次设置动画之前的位置) ... 动画卡片 ... 重复,等等......

答案 1 :(得分:0)

请注意,如果您将视图转换设置为除标识转换以外的任何内容,则视图的框架rect将变为" undefined"。您既不能将其设置为新值,也不能可靠地读取它的值。

如果您要更改转换,则应更改代码以使用视图的中心属性。

正如Jerland在帖子中指出的那样,你可能还需要在开始下一个动画周期之前将你的后卡重置为它的起始位置。 (将其设置为隐藏,将其中心放回起始位置并将其设置为转换回身份变换。

编辑:

此代码:

UIView.animate(withDuration: 1.0, delay: 0, options: .allowAnimatedContent, animations: {
    self.darkCardView?.frame = CGRect(x: xPosition, y: yPosition, width: width!, height: height!)
    self.darkCardView?.transform = (self.darkCardImageView?.transform.rotated(by: CGFloat(-Double.pi/4)))!
}) { (true) in
    self.darkCardView?.transform = (self.darkCardImageView?.transform.rotated(by: CGFloat(0)))!
    self.darkCardView?.frame = self.initialPos

    self.cardIn()
}

不将变换设置为identity。尝试将该行更改为

    self.darkCardView?.transform = .identity

答案 2 :(得分:0)

我设法通过调用viewDidLoad()而不是在 cardOut 完成块的末尾调用self.cardIn()来解决动画问题。但是每次新卡必须进入屏幕时我都不想依赖于调用 viewDidLoad ...

另外,我没有在 viewDidLoad 中设置后卡的任何属性。我只在.xib文件中有它。有什么想法吗?