2017-08-05 167 views
4

我正在處理一箇舊項目並想擺脫POP framework我確信任何動畫都可以用本機iOS框架完成。從`POPSpringAnimation`移植到Swift 4中的本機iOS框架

這裏是舊代碼:

POPSpringAnimation *springAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewFrame]; 
springAnimation.toValue = [NSValue valueWithCGRect:rect]; 
springAnimation.velocity = [NSValue valueWithCGRect:CGRectMake(springVelocity, springVelocity, 0, 0)]; 
springAnimation.springBounciness = springBounciness; 
springAnimation.springSpeed = springSpeed; 
[springAnimation setCompletionBlock:^(POPAnimation *anim, BOOL finished) { 
    if (finished) { 
     // cool code here 
    } 
}]; 

[self.selectedViewController.view pop_addAnimation:springAnimation forKey:@"springAnimation"]; 

我曾嘗試:

[UIView animateWithDuration:1.0 
         delay:0 
    usingSpringWithDamping:springBounciness 
     initialSpringVelocity:springVelocity 
        options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
         self.selectedViewController.view.frame = rect; 
} completion:^(BOOL finished) { 
    // cool code here 
}]; 

但是,我得到了相同的結果,有些問題上升:

  1. springBounciness在彈出相當於usingSpringWithDamping
  2. 什麼是springSpeed的相當於UIView的動畫?
  3. 持續時間是多少,POPSpringAnimation的持續時間是多少?

編輯: 關於第三個問題,我在Github發現了一個issue

如果UIView不是可以使用Core Animation或任何其他iOS本機動畫框架完成的嗎?

+0

波普爾正在使用特殊的求解器來決定抑制。你可能會更接近CASpringAnimation,但Pop很難被擊敗。特別是具有可中斷性。 – agibson007

+0

很抱歉評論,但解決方案在這種情況下解決持續時間。問題1也是。我認爲2是阻尼和初始速度的組合。 3.求解器使用衰減和查看大小以及春天的反彈來解決持續時間。 – agibson007

+0

@iosgeek請檢查我的答案。 TY。 – GeneCode

回答

1

彈出參數值範圍從0-20。但useSpringWithDamping沒有這樣的範圍。顯然,由於Pop是一個自定義庫,它有它自己的值範圍,而UIView動畫有它自己的。

從蘋果文檔,usingSpringWithDamping參數實際上是阻尼比的,它指定:

爲了順利減速沒有振盪的動畫,使用值1的錄用一個 阻尼比更接近零,以增加振盪。

1.因此,如果你想要相當的彈性,你需要使用低於1的任何值,我想你可以嘗試下面的公式springBounciness。

float uiViewBounciness = (20.0 - springBounciness)/20.0; 
.. usingSpringWithDamping:uiViewBounciness .. 

2.As爲springVelocity,流行實現相同的速度對於所有的動畫幀,而UIView的動畫僅指定初始速度,該速度是基於總持續時間和阻尼比衰減隨時間。因此,要獲得儘可能接近動畫越好,你可以做到以下幾點:

float uiViewSpeed = springVelocity * 2.0; 
.. initialSpringVelocity:uiViewSpeed .. 

3.As的持續時間,可以實現在UIView的方法相同的值animateWithDuration。

最後,您需要試驗這些值並將其與Pop動畫進行比較。我不認爲你可以通過使用UIView動畫獲得與Pop完全相同的動畫,但它應該足夠接近。

+0

夠公平的;)這是我們唯一能做的。 – iOSGeek