Анимация 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)
        }
    }


}

person nepete    schedule 10.08.2015    source источник


Ответы (3)


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

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

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

person Bharat Nakum    schedule 10.08.2015
comment
Это не просто так. Он исчезает с экрана, как только я нажимаю кнопку. - person nepete; 10.08.2015
comment
Прокомментируйте код, который вы написали в методе viewDidLayoutSubviews. - person Bharat Nakum; 10.08.2015
comment
хорошо, и кнопка, и анимация работают, если я закомментирую код в viewDidLayoutSubviews и viewDidAppear. Я до сих пор не понимаю, почему он так себя ведет. - person nepete; 11.08.2015
comment
Вы можете проверить эту ссылку: - stackoverflow.com/questions / 27110242 / - person Bharat Nakum; 11.08.2015

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

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)
            }
        }
    }
}
person MahatmaManic    schedule 12.08.2015

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

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

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

Я предлагаю обойти это, чтобы добавить такую ​​переменную count

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)
        }
    }
}
person Mandy Cho    schedule 07.02.2016