2010-12-12 13 views
9

मैं UIView एनीमेशनकैसे UIView फ्रेम मूल और आकार जबकि एनीमेशन

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:25]; 
myview.frame = CGRectMake(218, 216, myview.frame.size.width * 0.5, myview.frame.size.height * 0.5); 
[UIView commitAnimations]; 

और कॉलबैक विधि के साथ NSTimer है पाने के लिए। प्रश्न: क्या टाइमर कॉलबैक विधि के अंदर वर्तमान myview.frame आकार और उत्पत्ति प्राप्त करना संभव है?
या यह पता लगाने का एक और तरीका हो सकता है?

उत्तर

12

मुझे पूरा यकीन है कि यह संभव नहीं है, क्योंकि जब आप अपने दृश्य के frame को बदलते हैं तो यह तुरंत प्रभावी होता है। पृष्ठभूमि में, Core Animation एनीमेशन का ख्याल रखता है। तो, भले ही आप फ्रेम को पकड़ सकें, यह आपको अंतिम निर्देशांक देगा, न कि एनीमेशन के बीच वर्तमान निर्देशांक।

टिप्पणियों में NWCoder द्वारा इंगित की गई संपत्ति की प्रस्तुति परत तक पहुंचें। documentation देखें।

[view.layer.presentationLayer frame] 
+0

हां, मैंने देखा है (तुरंत के बारे में)। ठीक है, एक और तरीका की तलाश करेगा ... – heximal

+9

अगर किसी को भी इसकी जरूरत है, तो यह संभव है। आप इसका उपयोग कर सकते हैं: [[v.layer प्रस्तुति लेयर] फ्रेम]; – NWCoder

+0

@NWCoder: हे, शांत! पता नहीं था कि यह संभव था। –

1

दृश्य के फ्रेम को एनीमेशन के दौरान अपडेट नहीं किया गया है, जैसा आपने पाया है। आप myview.layer.frame (बस एक अनुमान लगा सकते हैं, हालांकि मुझे संदेह है कि यह काम नहीं करेगा)।

+0

असल में, myview.layer.frame ने ब्रायन द्वारा सुझाए गए अनुसार मेरे लिए ठीक काम किया। –

3

एनडब्ल्यूकोडर सही है। मोनो टच में कोड के बाद से मैं आपको सी # में एक उदाहरण दूंगा।

RectangleF start = new RectangleF(0,0,100,100); 
    RectangleF end = new RectangleF(100,100,100,100); 
    UIView yourView = new UIView(start); 

    UIView.Animate (120d, 0d, UIViewAnimationOptions.CurveLinear, delegate { 
    yourView.Frame = end; 
    }, delegate { }); 

उपरोक्त कोड ब्लॉक आपके दृश्य को 120 सेकंड में 0,0 से 100,100 तक ले जाएगा। एनीमेशन शुरू होने के पल में, आपका व्यू.फ्रेम पहले से ही सेट हो चुका है (100,100,100,100) ... इसलिए आपका व्यू.फ्रेम.एक्स पूरे 120 सेकंड के लिए 100 के बराबर होगा।

दूसरी ओर, यदि आप 120 सेकंड दौरान किसी भी समय नीचे पहली पंक्ति का उपयोग करें ...

float currentX = yourView.Layer.PresentationLayer.Frame.X 
    float currentProp = yourView.Layer.PresentationLayer.Frame.<any other frame property> 

... आप व्यवसाय में हैं। एनिमेट करते समय आपको लाइव फ्रेम गुण प्राप्त होंगे।

अच्छा काम करता है। मैं इसे अपने ऐप में अब इस्तेमाल कर रहा हूं।

+0

@ सुडो ने मुझे वोट दिया ... क्योंकि मैंने उसे वोट दिया ... नहीं क्योंकि मेरा जवाब गलत था। बल्कि बचपन में। सुडो का जवाब गलत था और एक कम वोट के लायक था। –

+0

क्षमा करें, बस आपकी टिप्पणी देखने के लिए हुआ। मैंने आपके जवाब को बिल्कुल कम नहीं किया। कृपया इस तरह के अन्य लोगों पर चीजें न मानें। –

+0

मुझे कुछ भी मानना ​​नहीं था। आपने अपनी पोस्ट को बहुत ही मिनट अपडेट किया है, मेरे जवाब को नीचे वोट मिला है। संयोग? संदिग्ध। –

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