2013-03-23 6 views
7

का उपयोग कर संपत्ति मैं एक सटीक इस UIView ब्लॉक आधारित एनीमेशन कोड का "अनुवाद" बनाने के लिए कोशिश कर रहा हूँ:चेतन फ्रेम CABasicAnimation

[UIView animateWithDuration:0.5 
         delay:0.0 
        options:UIViewAnimationOptionCurveEaseInOut 
       animations:^{ 
           someView.frame = CGRect(0, 100, 200, 200); 
          } 
       completion:nil]; 

CABasicAnimation बजाय का उपयोग कर। http://developer.apple.com/library/mac/#qa/qa1620/_index.html
... और मैं पहले से ही बनाया:

मैं पूरी तरह से पता है कि फ्रेम संपत्ति वास्तव में और अंतर्निहित परत की anchorPoint, के रूप में यह यहाँ वर्णित है स्थिति, सीमा का एक संयोजन है कर रहा हूँ इस तरह का एक समाधान, दो का उपयोग करके CABasicAnimations एक स्थिति सेटिंग, सीमा के लिए एक और यह उस दृश्य के लिए काम करता है।

समस्या यह है कि मेरे पास मेरे दृश्य के अंदर सबव्यूव हैं। कुछ दृश्य में UIScrollView का सबव्यूव है जिसमें मैं अभी भी UIImageView प्रकार का एक और सबव्यूव रखता हूं। UIScrollView सबव्यू में ऑटोरेसाइजिंगमास्कपर सेट UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight। अगर मैं UIView ब्लॉक-आधारित संस्करण का उपयोग करता हूं, तो मैं पूरी तरह से काम करता हूं, हालांकि जब मैं CABasicAnimations का उपयोग करने का प्रयास करता हूं तो सबव्यू अप्रत्याशित रूप से व्यवहार करना शुरू करते हैं (यानी गलत चौड़ाई में आकार बदलना)। तो ऐसा लगता है कि autoresizingMaskCABasicAnimations का उपयोग करते समय सही ढंग से काम नहीं कर रहा है। मैंने यह भी देखा कि सबव्यूज़ को सेटफ्रेम: पर कॉल प्राप्त नहीं होता है, हालांकि पैर की स्थिति में परिवर्तन के बाद मूल दृश्य की फ्रेम प्रॉपर्टी बदल जाती है और सीमाएं बनती हैं।

इसलिए मुझे पता है कि क्या CABasicAnimation कि जब एक UIView के animateWithDuration विधि का उपयोग करता क्या हो रहा है के साथ दोहराने के लिए सही कोड होगा चाहते हैं।

उत्तर

11

मैं पूरी तरह से पता है कि फ्रेम संपत्ति वास्तव में स्थिति, सीमा और अंतर्निहित परत की anchorPoint

अच्छा का एक संयोजन है कर रहा हूँ, लेकिन यह भी महत्वपूर्ण बारे में पता होना करने के लिए है कि frame एक animatable नहीं है परतों के लिए संपत्ति। यदि आप CABasicAnimation के साथ एनिमेट करना चाहते हैं तो आपको उन गुणों का उपयोग करना होगा जो परतों के लिए एनिमेटेबल हैं। कैलियर दस्तावेज़ प्रत्येक ऐसी संपत्ति को स्पष्ट रूप से "एनिमेटेबल" के रूप में चिह्नित करता है। bounds और position का उपयोग करने का विचार सही है।

[CATransaction setDisableActions:YES]; 
// set final bounds and position 
v.layer.bounds = CGRectMake(0,0,200,200); 
v.layer.position = CGPointMake(100,200); 

// cause those changes to be animated 
CABasicAnimation* a1 = [CABasicAnimation animationWithKeyPath:@"bounds"]; 
a1.duration = 0.5; 
CABasicAnimation* a2 = [CABasicAnimation animationWithKeyPath:@"position"]; 
a2.duration = 0.5; 
[v.layer addAnimation:a1 forKey:nil]; 
[v.layer addAnimation:a2 forKey:nil]; 

हालांकि, उस कोड v.layer के किसी भी sublayers के आकार पर कोई प्रभाव नहीं है:

इस प्रकार, इस कोड इससे पहले कि आप अनिवार्य रूप से क्या कर रहे थे करता है। (v का एक सबव्यू v.layer के उपनगर द्वारा खींचा जाता है।) दुर्भाग्यवश, वह समस्या है जिसे आप हल करने का प्रयास कर रहे हैं। मेरा मानना ​​है कि परतों के स्तर और सीधे स्पष्ट कोर एनीमेशन के स्तर पर उतरकर, आपने ऑटोरेसाइजिंग छोड़ दी है, जो दृश्य स्तर पर होती है।इस प्रकार आपको उपन्यासों को भी एनिमेट करने की आवश्यकता होगी। यही एनीमेशन आपके लिए क्या कर रहा था।

यह आईओएस की दुर्भाग्यपूर्ण विशेषता है। मैक ओएस एक्स में परत की बाधाएं (सीएसीओएनस्ट्रेन) होती हैं जो परत स्तर पर होती हैं जो दृश्य स्तर (और अधिक) पर ऑटोरेसाइजिंग करती है। लेकिन आईओएस उस सुविधा को याद कर रहा है।

+0

हां, मैंने @ "स्थिति" कीपैथ के लिए दो CABasicAnimimations बनाया है, दूसरा @ "सीमाओं" के लिए। मैंने अपने व्यक्ति को वैल्यू और टूवेल्यू से सेट कर दिया है। फिर मैंने एक CAAnimationGroup बनाया है और इन दो एनिमेशन को इसमें जोड़ा है, जिसके बाद मैं परत में समूह एनीमेशन जोड़ता हूं। अंत में मैंने कुछ वांछित .layer.bounds और someView.layer.position को नए वांछित मानों (toValue में उपयोग किया) पर सेट किया ताकि परिवर्तन वास्तव में मॉडल परत पेड़ में बनी रहे। –

+0

एनीमेशन कुछ दृश्यों के लिए काम करता है, जो एक मुख्य (अभिभावक) दृश्य है जिसमें अन्य सबव्यू शामिल हैं। समस्या यह है कि सबव्यूज़ का आकार बदल नहीं आता है, वे अपनी चौड़ाई रखते हैं जैसे ऑटोरेसाइजिंग मास्क (जो उन पर सेट है) में कोई समस्या है। UIView animateWithDuration का उपयोग करते समय यह सब काम करता है: हालांकि मैं CABasicAnimations का उपयोग करना चाहता हूं क्योंकि मुझे अतिरिक्त कॉन्फ़िगरेशन विकल्प की आवश्यकता है ... –

+2

मैं आपके साथ हूं। मुझे विश्वास है कि क्योंकि आप सीधे परत को एनिमेट कर रहे हैं, आपको मैन्युअल रूप से उपन्यासों की एनीमेशन प्रबंधित करना होगा। – matt

संबंधित मुद्दे