Ios 非常基本的快速动画

Ios 非常基本的快速动画,ios,swift,animation,Ios,Swift,Animation,我试图将视图从其在故事板上的位置向上移动100像素 如果随机生成的数字为1,则标签将更改为“他们尚未获胜” 如果随机生成的数字是2,则标签将更改为表示他们赢得了一次射击 我正在使用以下代码: override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) { if motion == .MotionShake{ let randomNumber = arc

我试图将视图从其在故事板上的位置向上移动100像素

如果随机生成的数字为1,则标签将更改为“他们尚未获胜”

如果随机生成的数字是2,则标签将更改为表示他们赢得了一次射击

我正在使用以下代码:

 override func motionEnded(motion: UIEventSubtype,
    withEvent event: UIEvent?) {

        if motion == .MotionShake{

           let randomNumber = arc4random_uniform(2) + 1

            print(randomNumber)

            if randomNumber == 1 {

                labelOne.text = "Sorry!"
                labelTwo.text = "You Have Not Won This Time"
                labelThree.text = "Better Luck Tomorrow"

            }

            if randomNumber == 2 {

                labelOne.text = "Winner!"
                labelTwo.text = "1 x Shot Patron Cafe"
                labelThree.text = "Show at the bar to claim."

            }

            let xPosition = stampView.frame.origin.x

            //View will slide 20px up
            let yPosition = stampView.frame.origin.y - 100

            let height = stampView.frame.size.height
            let width = stampView.frame.size.width

            UIView.animateWithDuration(3.0, animations: {

                self.stampView.frame = CGRectMake(xPosition, yPosition, height, width)


            })


            print("SHAKEN!")

        }

}
我发现,有时当我摇晃设备时,动画从原始位置下方的100px开始,然后移回原始位置,其他时候,动画将从最后一个位置向上移动额外的100px


如何确保它始终从故事板上的原始位置移动?

确保某些内容保持在同一位置的最佳方法是在
Main.storyboard
文件中对其进行约束(首先要做的事情)。另外,作为额外的预防措施,您可以在
viewDidLoad
中读取其帧值,然后在
motionend
中再次设置它

var stampFrame : CGRect = CGRect(x: 0, y: 0, width: 0, height: 0) // This is stampFrame's initial value before being set in viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()
    stampFrame = stampView.frame // Here we store the frame value for usage later
    // If you would like, you can also set this in a method like viewWillAppear or viewDidAppear, but I'd just keep it in viewDidLoad
}


override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {

    stampView.frame = stampFrame 

    if motion == .MotionShake{

       let randomNumber = arc4random_uniform(2) + 1

        print(randomNumber)

        if randomNumber == 1 {

            labelOne.text = "Sorry!"
            labelTwo.text = "You Have Not Won This Time"
            labelThree.text = "Better Luck Tomorrow"

        }

        if randomNumber == 2 {

            labelOne.text = "Winner!"
            labelTwo.text = "1 x Shot Patron Cafe"
            labelThree.text = "Show at the bar to claim."

        }

     //   let xPosition = stampView.frame.origin.x

     //   View will slide 20px up
     //   let yPosition = stampView.frame.origin.y - 100

     //   let height = stampView.frame.size.height
     //   let width = stampView.frame.size.width
     // The code above is redundant, we can just do it all in the UIView.animate 

        UIView.animate(withDuration: 3.0, animations: {

            self.stampView.frame.origin.y -= 100
     // This moves stampView's position up 100pts from its current location


        })


        print("SHAKEN!")

    }

不管怎样,我希望这会有帮助,如果您还有任何问题,欢迎您提问。

您使用自动布局吗?您好,不,我发现如果我将文本更改移出函数,它似乎可以非常愉快地工作。不知道为什么!可能是在后台线程上执行的“motionEnded”。正在尝试将代码包装到主队列中。如果有效,请告诉我。