2017-03-16 64 views
0

我有自定義類從UIScrollView的,其中包含「關閉按鈕」視圖繼承。通過按下「關閉按鈕」,我想進行動畫規模轉換,然後從SuperView中刪除整個視圖。迅速UIView.animate跳過動畫

class AddReview : UIScrollView { 

override init(frame: CGRect){ 
    super.init(frame: frame) 

    let closeButton = CloseButtonView() 
    closeButton.frame = CGRect(x:frame.maxX - 50, y:0, width: 50, height: 50) 
    self.addSubview(closeButton) 

    let tapCloseGestureRecognizer = UITapGestureRecognizer(target:self, action:#selector(closeButtonPressed)) 
    closeButton.isUserInteractionEnabled = true 
    closeButton.addGestureRecognizer(tapCloseGestureRecognizer) 
} 

func closeButtonPressed(){ 
    UIView.animate(withDuration: 0.3){ 
     self.transform = CGAffineTransform(scaleX: 1.1, y: 1.1) 
    } 

    UIView.animate(withDuration: 0.2, delay: 0.4, animations: {() -> Void in 
     self.transform = CGAffineTransform(scaleX: 0.1, y: 0.1) 
    }, completion: { (finished: Bool) -> Void in 
     if (finished) 
     { 
      //self.removeFromSuperview() 
     } 
    }) 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

} 

我在這裏的問題是,沒有動畫發生。立即刪除一個視圖,或者當removeFromSuperview被註釋掉時,它的大小調整爲10%,而沒有動畫。

我試着使用layoutIfNeeded,主隊列派遣,和很多其他的東西,但理智最多是工作。

更重要的是,我有時發現它的工作,但大多數時候它不工作!

任何想法,這可能是一個問題嗎? 非常感謝您的任何意見:)

+0

第二'UIView.animate'不等待,直到第一個已完成。第二個在第一個完成之前開始,所以我猜測,第二個覆蓋第一個並刪除了視圖。如果你想讓它們依次運行,你需要鏈接它們。 – Magnas

回答

0

由於Magnas曾表示,第一次有機會完成之前,第二個動畫被調用。嘗試:

UIView.animate(withDuration: 0.3, animations: {() -> Void in 
    self.transform = CGAffineTransform(scaleX: 1.1, y: 1.1) 
}, completion: { (finished: Bool) -> Void in 
    // wait for first animation to complete 
    UIView.animate(withDuration: 0.2, animations: {() -> Void in 
     self.transform = CGAffineTransform(scaleX: 0.1, y: 0.1) 
    }, completion: { (finished: Bool) -> Void in 
     if (finished) 
     { 
      //self.removeFromSuperview() 
     } 
    }) 
}) 

這可以稍微縮短:

UIView.animate(withDuration: 0.3, animations: { 
    self.transform = CGAffineTransform(scaleX: 1.1, y: 1.1) 
}, completion: { (finished: Bool) -> Void in 
    // wait for first animation to complete 
    UIView.animate(withDuration: 0.2, animations: { 
     self.transform = CGAffineTransform(scaleX: 0.1, y: 0.1) 
    }, completion: { finished in 
     if (finished) 
     { 
      //self.removeFromSuperview() 
     } 
    }) 
}) 
+0

謝謝Aleks,這似乎工作。但是在調試時不行,一旦調試器被分離,我必須手動關閉應用程序,重新啓動應用程序,然後才能正常工作。 –