2017-05-01 123 views
-1

我想我的viewController中的imageView「脈動」,這意味着變大,然後再變小,重複,直到「開始」按鈕被按下。問題是,每次我在viewDidLoad()中使用repeat-while循環調用該函數時,無論出於何種原因它都有一個斷點。重複while循環不起作用 - 爲什麼?

這是()我viewDidLoad中的一部分:

repeat { 
    pulsate() 
} while hasStarted == false 

當我按下啓動按鈕,hasStarted成爲真正的,它應該停止跳動。但它甚至不啓動該功能,它立即調用一個錯誤。問題在哪裏?

這裏是我的搏動() - 函數

func pulsate() 
{ 
    frameOR = imageView.frame 
    frameNext = CGRect(x: imageView.frame.midX - 35, y: imageView.frame.midY - 35, width: 80, height: 80) 
    let frameVDL = CGRect(x: imageView.frame.midX - 150, y: imageView.frame.midY - 150, width: 300, height: 300) 

    if start == false 
    { 
     UIView.animate(withDuration: 2, animations: { 
      self.imageView.frame = frameVDL 
     }) { (finished) in 
      UIView.animate(withDuration: 2, animations: { 
       self.imageView.frame = self.frameOR 
      }, completion: nil) 
     } 
    } 
} 

感謝您的幫助!祝你有美好的一天!

+2

有什麼錯誤? –

+1

您正在阻止主線程。在程序控制返回到主事件循環之前,沒有按鈕(或任何其他)的UI操作方法將被執行。 –

回答

3

你可以使用UIView.animate的內置選項來真正簡化你想要做的事情,避免鎖定線程。

試試這個:

let frameOR = imageView.frame 
let frameVDL = CGRect(x: imageView.frame.midX - 150, y: imageView.frame.midY - 150, width: 300, height: 300) 

UIView.animate(withDuration: 2.0, 
       delay: 0.0, 
       options: [UIViewAnimationOptions.autoreverse, UIViewAnimationOptions.repeat], 
       animations: { 
       imageView.frame = frameVDL 
       }, 
       completion: nil) 

你的ImageView現在應該在一個完整的「脈動」循環,而無需任何額外的代碼。當你準備停止動畫,只要致電:

imageView.layer.removeAllAnimations()