2016-04-30 2 views
0

К сожалению, я обнаружил, что UIView.animateWithDuration останавливается, как только вы сворачиваете свое приложение на рабочий стол и не возобновляете его, как только вы возвращаете его на передний план.Возобновить animateWithDuration. Повторить после возврата на передний план

Я провел последний час, пытаясь понять, как это решить (путем обнаружения переключения фона/переднего плана) и привело к добавлению наблюдателя. Я сделал это и успешно обнаружил его с помощью отладочного сообщения в консоли; однако я уверен, как возобновить анимацию (ы) в моих взглядах. Каков правильный способ приостановить/возобновить или даже перезапустить анимацию, когда приложение будет загружено обратно на передний план?

ViewController.swift

class ViewController: UIViewController { 
    func cameBackFromSleep(sender : AnyObject) { 
     // Restart animation here or resume? 
     print ("If you can see this, congrats... observer works :-)") 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Observer to detect return from background 
     NSNotificationCenter.defaultCenter().addObserver( self, selector: #selector(ViewController0.cameBackFromSleep(_:)), name: UIApplicationDidBecomeActiveNotification, object: nil ) 

     // Add a label 
     let label = UILabel(frame: CGRectMake(0, 600 , 200, 200)) 
     label.text = "test message" 
     label.font = UIFont.boldSystemFontOfSize(12) 
     label.sizeToFit() 
     self.view.addSubview(label) 

     // Animation to move label 
     func animateText() { 
      UIView.animateWithDuration(2.0, delay: 0.0, options: [ .Autoreverse, .Repeat, .CurveEaseInOut, .BeginFromCurrentState], animations: { 
       label.alpha = 0.3 
       label.frame.origin.x = ((global.maxwidth/2) * -1) 
       }, completion: { finished in 
        if finished { 
         label.frame.origin.x = 0.0 
        } 
      }) 
     } 

     // This guy here stops once you minimize the app to background 
     animateText() 
    } 
} 

ответ

1

animateText() Помещенный внутри comeBackFromSleep(_:). Я верю, что возобновление анимации очень тяжело, поэтому просто перезапустите ее.

поведение несколько имеет смысл из-за этого (вы можете посмотреть на себя методами AppDelegate «s):

func applicationDidBecomeActive(application: UIApplication) { 
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
} 

Он утверждает, что вы должны обновить пользовательский интерфейс (который включает в себя анимацию). Так что нормальное поведение анимации прекращается после того, как вы положили приложение в фоновом режиме.

+0

Я новичок в разработке Swift/iOS. Поскольку 'comeBackFromSleep()' выходит из области viewDidLoad() 'как я могу вызвать' animateText() ', который находится внутри' viewDidLoad() '? – theflarenet

+0

Вам нужно добавить 'func animateText()' OUTSIDE 'viewDidLoad()'. Таким образом, вы можете получить доступ к нему из любого другого метода. Поэтому поставьте 'func animateText()' ниже 'viewDidLoad()' и введите 'animateText()' в 'comeBackFromSleep()'. – Lawrence413

+0

Я понял, что это будет простое решение, но моя фактическая функция анимации имеет другие переменные, которые зависят от ширины метки в представлении, как только она уже запущена. У меня получилось сложным, что, по моему мнению, мое единственное решение - как-то удалить ярлык и снова добавить его в представление с анимацией каждый раз, когда приложение возвращается на передний план. – theflarenet