2011-09-11 14 views
5

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

समस्या यह है कि अगर मैं willRotateToInterfaceOrientation के दौरान उप दृश्यों के फ्रेम को बदल रहा हूं, तो एनीमेशन सही है, लेकिन फ्रेम सुपरव्यू अभी भी पुराने अभिविन्यास से फ्रेम है।

यदि मैं didRotateFromInterfaceOrientation के दौरान उप-दृश्य बदल रहा हूं, तो फ्रेम सुपरव्यू वास्तव में सही है, लेकिन फ्रेम परिवर्तन केवल घूर्णन एनीमेशन के बाद होता है और यह अच्छा नहीं लग रहा है।

अभिविन्यास बदलते समय उप दृश्यों के फ्रेम को बदलने का सही तरीका क्या है?

+0

मैंने प्रत्येक समस्या में एक विधि लिखकर इस समस्या को हल किया जो फ्रेम परिवर्तन भाग को संभालेगा। मैं willRotateToInterfaceOrientation में पैरेंट व्यू का फ्रेम सेट करूंगा और फिर CGFrameMake फ़ंक्शन का उपयोग करके एक नया समान फ्रेम उत्पन्न करूंगा और इसे प्रत्येक सबव्यू में पास कर दूंगा। यह मेरे लिए काम किया .... जांचें कि यह सहायक है या नहीं। – Mohammad

+0

मुझे आपका जवाब बिल्कुल समझ में नहीं आया। WillRotateToInterface में मुझे अभी भी superView के फ्रेम को नहीं पता है क्योंकि रोटेशन अभी तक नहीं हुआ है। यही समस्या है। – adamsiton

+0

मैं सबव्यूज़ को घुमाने के लिए सुपरव्यू के फ्रेम का उपयोग नहीं करता हूं। मैं गणना करता हूं कि घूर्णन के बाद सुपरव्यू के फ्रेम के लिए मूल्य क्या होगा और फिर गणना के आधार पर एक नया सीजीआरईटी बनाएं और उसके बाद प्रत्येक सबव्यू के ऑरेंटेशन विधि को संभालने के लिए इसे पास करें। यदि आप गणना करने में सक्षम नहीं हैं कि रोटेशन के बाद सुपरव्यू के फ्रेम के लिए मूल्य क्या होगा तो ऊपर आपके लिए काम नहीं करेगा। – Mohammad

उत्तर

3

मुझे लगता है कि आप layoutSubviews ओवरराइड करने का प्रयास कर सकते हैं। वहां आप मौजूदा अभिविन्यास के अनुसार उप-दृश्यों को लेआउट कर सकते हैं, बिना घुमाए/rotateFromInterfaceOrientation के बारे में परेशान किए। layoutSubviews हर बार विचारों को रखे जाने पर बुलाया जाता है। इससे आपको एनीमेशन के साथ अपने फ्रेम में बदलाव करने में मदद मिलेगी।

HTH,

अक्षय

+0

लेकिन इसका मतलब यह होगा कि मैं दृश्य में सभी लेआउट तर्क को स्थानांतरित कर रहा हूं और ViewController नहीं। वर्तमान में मैं UIViewController के गुणों के अनुसार उप दृश्य के लेआउट को सेट कर रहा हूं। तर्क को UIView में ले जाने का अर्थ है कि मुझे UIView को उपclass करना है और सभी पैरामीटर को इस कस्टम उप-क्लास में ले जाना है। मुझे पूरी तरह से यकीन नहीं है कि यह तर्क UIView में होना चाहिए और UIVIewController नहीं होना चाहिए, लेकिन मैं कोशिश करूंगा। – adamsiton

4

इस समारोह तुम क्या जरूरत है क्योंकि विचारों फ्रेम रोटेशन से बदल गया है के लिए काम करता है और यह कस्टम एनिमेशन रोकने नहीं करता है।

-(void)willAnimateRotationToInterfaceOrientation (UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    float width = UIInterfaceOrientationIsPortrait(toInterfaceOrientation) ? [[UIScreen mainScreen] applicationFrame].size.width : [[UIScreen mainScreen] applicationFrame].size.height; 
//do something with the width now 
//or you can get the height the same way 
}