UIView.animate和完成问题

时间:2018-02-05 22:50:58

标签: ios swift uiview

我遇到了UIView.animate的问题。

我想要的功能(貌似)很简单:有一个按钮,当你按住它时,整个屏幕会慢慢地被底部的不同颜色填充(通过一个名为bar的UIView向上移动到顶部,最终填满整个屏幕)。当条形图到达顶部时,背景将其颜色更改为条形图的颜色,条形图移回其原始状态,从视图中隐藏,并更改其颜色。当人员在栏到达顶部之前释放按钮时,栏会再次向下移动。

现在我已按如下方式解决了这个问题:

  @IBAction func buttonPressed(_ sender: Any) {        
    UIView.animate(withDuration: 3, animations: {
        self.bar.frame.origin.y = 0
    }, completion: {(finished: Bool) in
        if self.bar.frame.origin.y == 0 {

            self.backColor = self.barColor
            self.view.backgroundColor = UIColor(rgb: self.colors[self.backColor])

            self.changeBarColor()
            self.bar.backgroundColor = UIColor(rgb: self.colors[self.barColor])

            self.bar.frame.origin.y = self.view.frame.size.height

        }
    })

}


@IBAction func buttonReleased(_ sender: Any) {

    UIView.animate(withDuration: 0.5, animations: {
            self.bar.frame.origin.y = self.view.frame.size.height
    })
}

当用户松开按钮并在原始动画结束3秒之前再次按下按钮时,会出现问题。突然,完成块内的所有内容都被执行。我尝试使用if语句缓解问题,但这似乎不起作用。

我认为需要发生的是,当用户在第一个动画完成之前释放按钮时,需要取消动画。有人能指出我正确的方向吗?

我附上了一段视频来说明问题:

Video of Problem

1 个答案:

答案 0 :(得分:0)

您面临的问题是因为上一个动画仍在执行。关键是删除以前的动画。

@IBAction func buttonPressed(_ sender: Any) {     

if self.bar.frame.origin.y != self.view.frame.size.height
{
    view.layer.removeAllAnimations()
    UIView.animate(withDuration: 3, animations: {
        self.bar.frame.origin.y = 0
    }, completion: {(finished: Bool) in
         self.backColor = self.barColor
         self.view.backgroundColor = UIColor(rgb: self.colors[self.backColor])
         self.changeBarColor()
         self.bar.backgroundColor = UIColor(rgb: self.colors[self.barColor])
         self.bar.frame.origin.y = self.view.frame.size.height
    })
}
else
{   
    UIView.animate(withDuration: 3, animations: {
        self.bar.frame.origin.y = 0
    }, completion: {(finished: Bool) in
        if self.bar.frame.origin.y == 0 {

            self.backColor = self.barColor
            self.view.backgroundColor = UIColor(rgb: self.colors[self.backColor])

            self.changeBarColor()
            self.bar.backgroundColor = UIColor(rgb: self.colors[self.barColor])

            self.bar.frame.origin.y = self.view.frame.size.height

        }
    })
}
}

@IBAction func buttonReleased(_ sender: Any) {
    view.layer.removeAllAnimations()
    UIView.animate(withDuration: 0.5, animations: {                
            self.bar.frame.origin.y = self.view.frame.size.height
    })
}