2014-10-09 6 views
0

Я пытаюсь создать приложение, в котором анимация должна работать до тех пор, пока не будет нажата кнопка. Я попытался использовать бесконечный цикл, но с этим циклом мое приложение не работает вообще. Он потребляет всю память. Я также попытался снова вызвать ту же функцию при завершении, но этот процесс также потребляет 100% процессора.Запустите анимацию до тех пор, пока не будет нажата кнопка

не могли бы вы посоветовать мне, что мне делать здесь.

сценарий похож на задний план, анимация должна работать непрерывно до тех пор, пока не будет нажата кнопка. Другое окно откроется, когда будет нажата кнопка, и снова другая анимация будет работать непрерывно, пока не будет нажата другая кнопка. Ниже мой код:

func unlimitedLoop() 
    { 

     rotating = true 

     self.ProcurementSupport.transform = CGAffineTransformMakeTranslation(0, 100) 
     self.ProcurementSupport.hidden = false 



     UIView.animateWithDuration(3, delay: 2, usingSpringWithDamping: 2, initialSpringVelocity: 2, options: nil, animations: { 
      // self.EquipmentSupport.hidden = true 

      var x:NSTimeInterval = 2 



       springWithDelay(2, x, { 
        self.ProcurementSupport.transform = CGAffineTransformMakeTranslation(0,0) 
        self.EquipmentSupport.transform = CGAffineTransformMakeTranslation(1000,0) 
        x=x+2 
       }) 

       springWithDelay(2, x, { 
        self.EquipmentSupport.transform = CGAffineTransformMakeTranslation(0,100) 
        x=x+2 
       }) 

       springWithDelay(2, x, { 
        self.ProcurementSupport.transform = CGAffineTransformMakeTranslation(1000,0) 
        self.EquipmentSupport.transform = CGAffineTransformMakeTranslation(0,0) 
        x=x+2 
       }) 
       springWithDelay(2, x, { 
        self.ProcurementSupport.transform = CGAffineTransformMakeTranslation(0, 100) 
        x=x+2 
       }) 



      }, completion: {finished in self.unlimitedLoopAgain()}) 


    } 

ответ

0

При выполнении пользовательской анимации, создавая бесконечный цикл вам нужно запустить эту функцию в отдельном потоке. Помимо самого цикла лучше всего остановить поток в течение небольшого промежутка времени для каждого кадра, например, вызвать sleep для 1.0/60.0, чтобы получить около 60FPS. Еще одна проблема, которая возникает в этом подходе, заключается в том, что когда новый поток изменяет параметр в системе просмотра, он, скорее всего, обратится к основному потоку, чтобы обновить представление «set needs display». Ни в коем случае не следует создавать такую ​​функцию и в ней вызывать встроенную анимацию, как и вы, вам нужно сделать анимацию самостоятельно.

Лучшим подходом обычно является использование какого-либо таймера или ссылки на изображение в вашем случае. Этот элемент будет запускаться каждый раз, когда дисплей будет перерисовываться, поэтому он идеально подходит для вашей анимации. Эти вызовы чаще всего уже находятся в основном потоке, поэтому вам больше ничего не нужно. Затем следует избегать создания встроенной анимации.

Еще один способ - использовать рекурсию. Каждый раз, когда вы обновляете анимацию, вы вызываете один и тот же метод обновления после некоторого времени задержки (1.0/60.0), например ...

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

Смежные вопросы