2015-07-08 10 views
7

UIView.animateWithDuration uygulandığında, varsayılanın aksine, kolaylık için özel bir eğri tanımlamak istiyorum: .CurveEaseInOut, .CurveEaseIn, .CurveEaseOut, .CurveLinear.AnimateWithDuration'da özel kolaylık?

Bu benim UIView.animateWithDuration uygulanmasını istediğiniz bir örnek kolaylığıdır:

let ease = CAMediaTimingFunction(controlPoints: Float(0.8), Float(0.0), Float(0.2), Float(1.0)) 

Ben kendi UIViewAnimationCurve yapma çalıştı, ancak yalnızca bir Int kabul görünüyor.

Özel kolaylığı bir Çekirdek Animasyona uygulayabilirim, ancak daha basit ve iyileştirilmiş kodlar için UIView.animateWithDuration için özel gevşeme yapmak istiyorum. UIView.animateWithDuration her animasyonlu özellik ve kolay tamamlama işleyicileri için animasyonları tanımlamak ve tüm animasyon kodlarını tek bir işlevde kullanmak zorunda kalmayacağım için benim için daha iyidir. - kullanmak ne eğri belirlemek için kullanılan tamsayı değerler onun temelde insan tarafından okunabilir gösterimleri UIViewAnimationCurve bir numaralandırma çünkü var

let customOptions = UIViewAnimationOptions(UInt((0 as NSNumber).integerValue << 50)) 
UIView.setAnimationCurve(UIViewAnimationCurve(rawValue: 5)!) 

UIView.animateWithDuration(2, delay: 0, options: customOptions, animations: { 
     view.layer.position = toPosition 
     view.layer.bounds.size = toSize 
     }, completion: { finished in 
      println("completion") 
}) 
+0

bu soruya bir göz atın bakın. Cevapların çoğu objektif-c'dedir, ancak bir sürü seçenek vardır: http://stackoverflow.com/q/5161465/4114683 – TheSD

+0

Zamanlama işlevleri hakkında harika bilgi. Bu da çok yardımcı olur: http://netcetera.org/camtf-playground.html Bununla birlikte, bunların tümü CA Animasyonu içindir (özel eğrileri yapmak için kullanılması gerekir). OP, bu eğrileri UIView animasyon bloğuna eklemek istedi. –

+0

Şimdiye kadar, cevabım HAYIR gibi geliyor. –

cevap

4

:

İşte şimdiye kadar benim olmayan çalışma kod.

Kendi eğrinizi tanımlamak isterseniz, CA animasyonlarını kullanmanız gerekir.

Hala tamamlama blokları ve animasyon grupları yapabilirsiniz. Sen grubun birden CA Animasyonlar tamamlanması için bir CAAnimationGroup

let theAnimations = CAAnimationGroup() 
theAnimations.animations = [positionAnimation, someOtherAnimation] 

içine, bir CATransaction kullanmak can.

CATransaction.begin() 
CATransaction.setCompletionBlock {() -> Void in 
    // something? 
} 
// your animations go here 
CATransaction.commit() 
+0

Chris haklı. "AnimateWithDuration" ailesindeki "UIView" animasyon yöntemleriyle özel hareket hızı eğrilerini kullanamazsınız. (En azından yaratılan CAAnimation'ı değiştirdiğiniz bazı hileler olmadan olmaz.) Çekirdek Animasyon, UIView animasyonundan çok daha güçlü ve çok daha karmaşıktır. –

+0

Bir takip animasyonum varsa, bu animasyonu setCompletionBlock içine koymak en iyisidir? Ve üçüncü bir animasyon ise, o zaman THAT setCompletionBlock'ta başka bir animasyon mu? Benim için her biri beklenti ve aşma ile 3 adımlı animasyon çok yaygın olacak. –

+0

Dürüst olmak gerekirse, tamamlama parası olmadığı için bunun gibi bir şey için tamamlama bloklarını kullanmaktan kaçınıyorum. Animasyonun zamanlamasını biliyorsanız, her bir animasyon için 'beginTime' ayarlarınızı uygun bir şekilde ayarladığımı söyleyebilirim. Bir şey gibi: 'myAnimation.beginTime = 1' Duncan gibi, onun daha güçlü ve esnek olduğunu söyledi.Ayrıca, uygulamanızda bazı yaygın animasyonlarınız varsa, bunları bir kategoride oluşturabilir ve aşağıdaki gibi kısa erişime sahip olabilirsiniz: 'myLayer.addAnimation (CABasicAnimation.addOpacityAnimationWithDuration (1), forKey:" opacity ") –

İlgili konular