2015-08-10 3 views
1

У меня есть анимация, которая работает нормально, пока я не изменил текст кнопки с начала до упора. Текст изменяется, но сама анимация исчезает. Что я делаю не так?Swift 2 анимация iOS 9 исчезает после изменения текста кнопки

 

import UIKit 

class ViewController: UIViewController { 

    var counter = 1 

    var timer = NSTimer() 

    var isAnimating = false 

    @IBOutlet weak var button: UIButton! 

    @IBOutlet weak var frogsImage: UIImageView! 

    @IBAction func updateImage(sender: AnyObject) { 

     if isAnimating == false { 
      timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("doAnimation"), userInfo: nil, repeats: true) 
      isAnimating = true 
      button.setTitle("Stop Jumping", forState: UIControlState.Normal) 

     } else { 
      timer.invalidate() 
      isAnimating = false 
      button.setTitle("Start Jumping", forState: UIControlState.Normal) 
     } 

      } 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    func doAnimation() { 
     if counter == 4 { 
      counter = 1 
     } else { 
      counter++ 
     } 

     frogsImage.image = UIImage(named: "frame\(counter).png" 
     ) 

    } 


    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    override func viewDidLayoutSubviews() { 

     // Hiding off the screen 
     frogsImage.center = CGPointMake(frogsImage.center.x - 400, frogsImage.center.y) 

    } 

    override func viewDidAppear(animated: Bool) { 
     UIView.animateWithDuration(1) {() -> Void in 
      self.frogsImage.center = CGPointMake(self.frogsImage.center.x + 400, self.frogsImage.center.y) 
     } 
    } 


} 

ответ

0

Анимация остановлена, потому что вы отменяете таймер.

После недействительности таймера вы должны перезапустить его снова. Итак, вы снова запустите анимацию.

Надеюсь, это поможет.

+0

Это не просто остановить. Он исчезает с экрана, как только я нажимаю кнопку. – nepete

+0

Просим прокомментировать код, который вы написали в методе viewDidLayoutSubviews. –

+0

ОК, как кнопка, так и анимация работают, если я прокомментирую код в viewDidLayoutSubviews и viewDidAppear. Я до сих пор не понимаю, почему так происходит. – nepete

0

Вот несколько вещей, которые я бы сделал по-другому, но у меня нет работы в проекте, поэтому я не могу гарантировать, что все это сработает.

class ViewController: UIViewController { 

    var counter = 1 

    var timer = NSTimer() 

    var isAnimating = false 
    var didSetup = false 
    var didAnimateIn = false 

    @IBOutlet weak var button: UIButton! 
    @IBOutlet weak var frogsImage: UIImageView! 
    @IBAction func updateImage(sender: AnyObject) { 

     if isAnimating == false { 
      timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("doAnimation"), userInfo: nil, repeats: true) 
      isAnimating = true 
      button.setTitle("Stop Jumping", forState: UIControlState.Normal) 

     } else { 
      timer.invalidate() 
      isAnimating = false 
      button.setTitle("Start Jumping", forState: UIControlState.Normal) 
     } 

    } 

    func doAnimation() { 
     if counter == 4 { 
      counter = 1 
     } else { 
      counter++ 
     } 

     frogsImage.image = UIImage(named: "frame\(counter).png" 
     ) 

    } 

    override func viewDidLayoutSubviews() { 
     // Change this to always call super first 
     super.viewDidLayoutSubviews() 

     // Only do this once 
     if !didSetup { 
      didSetup = true 
      frogsImage.center = CGPointMake(frogsImage.center.x - 400, frogsImage.center.y) 
     } 

    } 

    override func viewDidAppear(animated: Bool) { 
     // Change this to always call super 
     super.viewDidAppear(animated) 

     // Only do this once, after setup 
     if didSetup && !didAnimateIn { 
      didAnimateIn = true 
      UIView.animateWithDuration(1) {() -> Void in 
       self.frogsImage.center = CGPointMake(self.frogsImage.center.x + 400, self.frogsImage.center.y) 
      } 
     } 
    } 
} 
0

Что происходит, так это то, что ваше изображение снова возвращается на 400 пикселей влево. Вы можете проверить это самостоятельно, изменив сдвиг влево на 40 пикселей и запустив приложение. Это связано с тем, что viewDidLayoutSubviews вызывается в нескольких случаях и сбрасывает местоположение изображения в соответствии с тем, что вы указали изначально.

Другими словами, метод вызывается при

  1. приложение открыто
  2. снова до анимации
  3. когда кнопка повернутой.

Как я предлагаю обойти это добавить переменную счетчика, как так

import UIKit 

class ViewController : UIViewController { 
    var viewCount = 0 //ADD THIS 

    var counter = 1 

    var timer = NSTimer() 

    var isAnimating = false 

    @IBOutlet weak var button: UIButton! 

    @IBOutlet weak var frogsImage: UIImageView! 

    @IBAction func updateImage(sender: AnyObject) { 

     if isAnimating == false { 
      timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("doAnimation"), userInfo: nil, repeats: true) 
      isAnimating = true 
      button.setTitle("Stop Jumping", forState: UIControlState.Normal) 

     } else { 
      timer.invalidate() 
      isAnimating = false 
      button.setTitle("Start Jumping", forState: UIControlState.Normal) 
     } 

    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    func doAnimation() { 
     if counter == 4 { 
      counter = 1 
     } else { 
      counter++ 
     } 

     frogsImage.image = UIImage(named: "frame\(counter).png") 
    } 


    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    override func viewDidLayoutSubviews() { 

     // ADD THIS IF BLOCK 
     if viewCount < 2 { 
      frogsImage.center = CGPointMake(frogsImage.center.x - 400, frogsImage.center.y) 
      viewCount++ 
     } 

    } 

    override func viewDidAppear(animated: Bool) { 
     UIView.animateWithDuration(1) {() -> Void in 
      self.frogsImage.center = CGPointMake(self.frogsImage.center.x + 400, self.frogsImage.center.y) 
     } 
    } 
}