2013-12-17 15 views
10

जब UIView के मुख्य-फ़्रेम एनीमेशन का उपयोग कर एनीमेशन वक्र कैसे निर्धारित करें:कैसे एनीमेशन वक्र स्थापित करने के लिए?

animateKeyframesWithDuration:delay:options:animations:completion: 

जो कुछ भी मैं एनीमेशन ब्लॉक में क्या (जब तक मैं UIViewKeyframeAnimationOptionCalculationModeCubic विकल्प का उपयोग, लेकिन यह नहीं है कि मैं क्या चाहता हूँ) रैखिक हो रहा है।

मैं जब नियमित रूप से एनीमेशन का उपयोग कर एक आसानी बाहर वक्र UIViewAnimationOptionCurveEaseOut विकल्प की तरह एनीमेशन पर करना चाहते हैं:

animateWithDuration:delay:options:animations:completion: 

उत्तर

3

मुख्य-फ़्रेम का उपयोग कर रहे हैं, तो आप अपने दम पर वक्र को परिभाषित करने के लिए है .. यदि आप रैखिक कीफ्रेम जोड़ते हैं, तो आपके पास रैखिक एनीमेशन है। यदि आप गैर-रैखिक कीफ्रेम जोड़ते हैं, तो आपके पास एक गैर-रैखिक एनीमेशन होगा।

frameStartTime अपने दोस्त यहाँ है ... यह हमेशा फ़्रेम के बीच रैखिक (या गति/घन/घन रफ़्तार, UIViewKeyframeAnimationOptionCalculationMode में परिभाषित की तरह)

UIViewKeyframeAnimationOptionCalculationModeLinear  = 0 << 9, 
UIViewKeyframeAnimationOptionCalculationModeDiscrete = 1 << 9, 
UIViewKeyframeAnimationOptionCalculationModePaced  = 2 << 9, 
UIViewKeyframeAnimationOptionCalculationModeCubic  = 3 << 9, 
UIViewKeyframeAnimationOptionCalculationModeCubicPaced = 4 << 9 

सही समय मूल्यों की गणना करने के लिए, आप कर सकते थे किया जाएगा RBBEasingFunction

उदाहरण के लिए: एक संदर्भ के रूप में उपयोग EaseInOutQuad इस तरह (जहां टी एनीमेशन के भीतर संबंधी समय है): देरी: विकल्प: एनिमेशन:

if (t < 0.5) { 
    return 2 * t * t; 
} else { 
    return -1 + (4 - 2 * t) * t; 
} 
14

असल में, आप एक ही वक्र झंडे कि आप animateWithDuration के लिए उपयोग का उपयोग कर सकते पूरा होने :. एनिमेट करने के लिए आपके कॉल में अन्य विकल्पों के साथ बस "द्विआधारी या" इनके बीच कीफ्रेम: विलंब: विकल्प: एनिमेशन: समापन:

दस्तावेज़ीकरण भ्रमित है, लेकिन यह काम करता है।

वक्र आप उपयोग कर सकते हैं मान हैं:

UIViewAnimationOptionCurveEaseInOut = 0 << 16, 
UIViewAnimationOptionCurveEaseIn = 1 << 16, 
UIViewAnimationOptionCurveEaseOut = 2 << 16, 
UIViewAnimationOptionCurveLinear = 3 << 16, 

डिफ़ॉल्ट एनीमेशन वक्र आपको मिल 0 है, या आसानी में, आसानी से बाहर।

+1

100% सही काम करता है। – orkenstein

+2

बहुत बढ़िया! ठीक काम करता है। बहुत अजीब यह प्रलेखन में नहीं है, विशेष रूप से क्योंकि उनके पास डिफ़ॉल्ट रूप से गैर-रैखिक है ... –

+0

ठीक है, सभी कीफ्रेम विकल्प का प्रयास करने के बाद मैं इस पर वापस गया जो मुझे शुरू करना था। यह एक चेतावनी देता है लेकिन पूरी तरह से काम करता है :) – Fogmeister

15

स्विफ्ट 2.0 के UIViewKeyframeAnimationOptions के कास्टिंग की अनुमति नहीं देगा। यह भी उन्हें एक साथ ing | अनुमति नहीं दी जाएगी।

हालांकि, वहाँ है कि एक rawValue लेता UIViewKeyframeAnimationOptions के लिए एक प्रारंभकर्ता है। तो, निम्नलिखित कोड UIViewKeyframeAnimationOptions में UIViewAnimationOptions डाल करने के लिए काम करता है:

let animationOptions: UIViewAnimationOptions = .CurveEaseOut 
let keyframeAnimationOptions: UIViewKeyframeAnimationOptions = UIViewKeyframeAnimationOptions(rawValue: animationOptions.rawValue) 

तब मैं animateKeyframesWithDuration को keyframeAnimationOptions पारित कर सकते हैं और सब कुछ अच्छा काम करता है।

+0

स्विफ्ट के बारे में अच्छी बात के साथ उस पर काबू पाने में सक्षम होना चाहिए। (वोट दिया गया) –

+2

भगवान यह काम करता है धन्यवाद! धन्यवाद! –

+1

मैं'CurveEaseOut' प्रभाव को कैसे बढ़ा सकता हूं? धन्यवाद, अच्छा जवाब! –

7

यहाँ एक अच्छे और साफ स्विफ्ट समाधान मैं के साथ आया है:

extension UIViewKeyframeAnimationOptions { 

    init(animationOptions: UIViewAnimationOptions) { 
     rawValue = animationOptions.rawValue 
    } 

} 

उपयोग:

UIViewKeyframeAnimationOptions(animationOptions: .CurveEaseOut) 
0

@eskimwier द्वारा जवाब मेरे लिए काम नहीं किया जब को वक्र सेट करने का प्रयास linearanimateKeyframes(withDuration:delay:options:animations:completion:) के लिए।यह स्विफ्ट 3, एक्सकोड 8.2.1 में था।

मेरी एनीमेशन easeInOut (धीमी गति से शुरू, मध्य में तेज, अंत में धीमी) के लिए डिफ़ॉल्ट होने लगती है। क्या ऐप्पल ने डिफ़ॉल्ट वक्र बदल दिया?

किसी भी तरह, मैं एक रेखीय वक्र चाहते थे, और करने की कोशिश की दृष्टिकोण-फ़्रेम एनिमेशन के साथ UIViewAnimationOptions उपयोग करने के लिए ऊपर का सुझाव दिया:

let animationOptions: UIViewAnimationOptions = .curveLinear 
var keyframeAnimationOptions: UIViewKeyframeAnimationOptions = UIViewKeyframeAnimationOptions(rawValue: animationOptions.rawValue) 

UIView.animateKeyframes(withDuration: 3, delay: 0, options: [keyframeAnimationOptions], animations: { 
    //... animations here ... 
}, completion: nil) 

यह कोई प्रभाव नहीं पड़ा। मेरे लिए काम करने वाली एकमात्र चीज एनिमेट को कॉल करने से पहले ऐसा करना था:

UIView.setAnimationCurve(UIViewAnimationCurve.linear) 
संबंधित मुद्दे