Анимацията на 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 пиксела наляво. Можете да проверите това сами, като вместо това промените изместването наляво на 40px и стартирате приложението. Това се дължи на факта, че 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)
        }
    }
}
person Mandy Cho    schedule 07.02.2016