在Swift中使用动画上下移动UIImage

时间:2017-11-13 09:56:10

标签: ios iphone swift xcode

我刚刚开始使用Xcode和Swift,我试图让我的图像上下移动,并在用户点击屏幕时切换方向。我的图像根本不会移动,应用程序会崩溃或只是冻结。

import UIKit
import SpriteKit
import Darwin

let startButton = UIButton(frame: CGRect(x: 200, y: 100, width: 100, height: 50))
let screenSize = UIScreen.main.bounds
let gameButton = UIButton(frame: CGRect(x: 0, y: 0, width: screenSize.width, height: screenSize.height))

var dot: UIImage = UIImage(named: "dot")!
var dotPic = UIImageView(image: dot)

public var goingUp = true

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = .white

    startButton.addTarget(self, action: #selector(startButtonAction), for: .touchUpInside)
    startButton.setImage(UIImage.init(named: "startButton"), for: .normal)

    self.view.addSubview(startButton)
}

func startButtonAction(sender: UIButton!) {
    print("button clicked")
    startButton.isEnabled = false
    startButton.setImage(UIImage.init(named: "nothing"), for: .normal)
    self.view.backgroundColor = .gray
    dotPic.frame = CGRect(x: 50, y: 300, width: 20, height: 20)

    self.view.addSubview(dotPic)
    self.view.addSubview(gameButton)

    playGame()
}

func playGame(){
    gameButton.addTarget(self, action: #selector(gameButtonAction), for: .touchUpInside)
    gameButton.setImage(UIImage.init(named: "nothing"), for: .normal)
}

func gameButtonAction(sender: UIButton!) {
    goingUp = !goingUp
    print(goingUp)
    print("clicked up/down")

    func rep(){
        repeat{
            dotPic.frame = CGRect(x: 50, y: 300-1, width: 20, height: 20)
            sleep(UInt32(0.3))
        }while goingUp==true
        repeat{
            dotPic.frame = CGRect(x: 50, y: 300-1, width: 20, height: 20)
            sleep(UInt32(0.3))
        }while goingUp==false
    }
    rep()
}

}

我也试过使用animateWithDuration(),但它总是冻结应用程序。我做错了什么?

2 个答案:

答案 0 :(得分:0)

在这里,试试这个,而不是你的gameButtonAction中的func rep():

[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveLinear  animations:^{
        //code with animation
dotPic.frame = CGRect(x: 50, y: 300-1, width: 20, height: 20)
    } completion:^(BOOL finished) {
        //code for completion
dotPic.frame = CGRect(x: 50, y: 300, width: 20, height: 20)
    }];

并避免在目标中使用嵌套函数rep()。可能它会持续运行导致您的应用程序挂起。

答案 1 :(得分:0)

试图在swift中使用此代码......

self.hintImageView.frame = CGRect(x: x, y: 55, width: 200, height: 40)
UIView.animate(withDuration: 0.5, delay: 0, options: [.repeat, .autoreverse] , animations: {
        self.hintImageView.frame = CGRect(x: x, y: 65, width: 200, height: 40);
    }) { (completed) in

    }