2013-03-07 9 views
5

के दौरान नहीं कहा जाता है मेरे पास GLKit-आधारित ऐप कुछ साधारण ऑब्जेक्ट प्रदर्शित होता है।GLKit's -DrawRect: स्क्रीन रोटेशन

स्क्रीन रोटेशन को छोड़कर सभी ठीक काम करता है, जिसके दौरान GLKView अपडेट नहीं किया गया है (-drawRect: नहीं कहा जाता है)। तो घूर्णन प्रक्षेपण मैट्रिक्स के दौरान गतिशील रूप से बदलते स्क्रीन आकारों के अनुसार अद्यतन नहीं किया जाता है और वस्तु बुरी तरह से दिखती है (खिंचाव)।

+0

क्या आप शेडर्स या GLKBaseEffect का उपयोग कर रहे हैं? –

+0

दोनों ने कोशिश की: 'GLKBaseEffect' और मेरे अपने शेडर्स - एक ही परिणाम। '-drawRect: 'एनीमेशन समाप्त होने के बाद कहा जाएगा - इसलिए किसी भी जीएल प्रतिपादन (जिसे हम आम तौर पर वहां रखते हैं) उस पल में निलंबित कर दिया जाएगा। – kpower

+1

ठीक है। मैं सोच रहा था कि शायद GLKBaseEffect पर प्रक्षेपण मैट्रिक्स प्रॉपर्टी छोटी थी। मुझे लगता है कि ... –

उत्तर

1

यह बिल्कुल नहीं है कि UIKit एनिमेशन कैसे काम करते हैं। मैं इन सबसे-का वर्णन करती हैं कि यह के आधे this answer में काम करता है, लेकिन मैं प्रासंगिक बिट संक्षेप में प्रस्तुत करने की कोशिश करेंगे:

  • सब कुछ एक बनावट आयत है। (कुछ अपवाद हैं, जैसे कि कैशपलेयर, लेकिन यह अधिकांश भाग के लिए सच है।)
  • UIView की गुण कैलियर के "मॉडल पेड़" गुणों से जुड़ी हैं। वे तत्काल बदलते हैं।
  • एनिमेशन प्रारंभिक मान से वर्तमान मॉडल मान तक "प्रस्तुति वृक्ष" गुणों को एनिमेट करके काम करते हैं।
  • एनीमेशन का प्रारंभिक मूल्य, डिफ़ॉल्ट रूप से, पिछले मॉडल मान है। UIViewAnimationOptionBeginFromCurrentState निर्दिष्ट करना यह वर्तमान प्रस्तुति मान का उपयोग करता है।

रहे हैं, ज़ाहिर है, कुछ अपवादों को छोड़कर (CAShapeLayer एक बनावट रेक्ट की तुलना में अधिक हो सकता है, लगता है UIScrollView एक टाइमर पर एनिमेशन स्क्रॉल करता है, UIView संक्रमण पूरी तरह से एक और बात कर रहे हैं ...)।

कैसे रोटेशन चाहिए है काम करने के लिए है कि आप प्राप्त एक भी -setFrame:, सब कुछ खर्च की गई थी (और संभवत: rerendered), और फिर animatable गुण एनिमेटेड रहे हैं। डिफ़ॉल्ट रूप से, इसका मतलब है कि चीजें नए आयामों को फिर से प्रस्तुत की जाएंगी लेकिन पुराने आयामों को फिट करने के लिए फैली हुई हैं, और फिर घूर्णन प्रगति के रूप में एनिमेट (और अनस्ट्रेच) करें।

ने कहा, GLKView अलग-अलग काम कर सकता है।यदि आप GLKViewController का उपयोग कर रहे हैं, तो यह रोटेशन एनीमेशन के दौरान प्रतिपादन को निलंबित भी कर सकता है। आप रोटेशन के दौरान -setNeedsDisplay पर कॉल करने का प्रयास कर सकते हैं, लेकिन फ्रेम बहुत पहले से ही इसके अंतिम मूल्य पर सेट होने के बाद से बहुत मदद नहीं करेगा।

शायद रोटेशन एनीमेशन को संभालने का सबसे आसान तरीका घुमावदार फ्रेम में एक गैर-एनिमेटेड रिलाउट को मजबूर करना है और फिर रेंडरर में कुछ झुकाव करना (काला सीमा और स्टेटस बार अलग से एनिमेट करना)।

वैकल्पिक रूप से, पारंपरिक तरीका अपने वीसी पोर्ट्रेट को केवल बनाने और डिवाइस अभिविन्यास अधिसूचनाओं को स्वयं संभालने का है, लेकिन यह कीड़े का एक बड़ा हिस्सा है (फिर आपको स्टेटस बार अभिविन्यास के बारे में चिंता करने की ज़रूरत है जो स्पर्श की तरह चीजों को निर्धारित करता है ऑफसेट और कीबोर्ड अभिविन्यास, और यह अन्य वीसी से/में संक्रमण करते समय "दिलचस्प" पर बातचीत करता है)।

0

सबसे पहले, सुनिश्चित करें कि आपके आवेदन जीवन चक्र में कुछ बिंदु पर, डिवाइस अभिविन्यास परिवर्तन सक्षम करें।

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

फिर जब आपके विचार तो जैसे एक अधिसूचना के लिए instantiated है रजिस्टर।

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(deviceOrientationDidChange:) name: UIDeviceOrientationDidChangeNotification object: nil]; 

फिर अपने दृश्य नियंत्रक में -deviceOrientationDidChange: को लागू करने और फोन -setNeedsDisplay

+0

'-... अभिविन्यास परिवर्तन के बाद DidChange' कहा जाएगा। और इस बार 'drawRect:' भी कहा जाएगा (क्योंकि मैं समय और प्रत्येक फ्रेम परिवर्तन पर matrices अद्यतन)। लेकिन मुझे इस प्रक्रिया के दौरान परिवर्तन लागू करने की जरूरत है। – kpower

+0

अब मैं देखता हूं। हालांकि मैं कह रहा था कि आपको कोई रोटेशन जानकारी नहीं मिल रही थी। व्यू कंट्रोलर विधि को सुनें और कार्यान्वित करें '- (शून्य) willnimateRotationToInterfaceOrientation: (UIInterfaceOrientation) इंटरफ़ेसऑरिएंटेशन अवधि: (NSTimeInterval) अवधि'। अवधि आपको संक्रमण के दौरान अपने एनिमेशन की गणना करने की अनुमति देगी। –

+1

हाँ, मुझे पता है। और मैं व्यू के '-सेटफ्रेम' को भी कार्यान्वित कर सकता हूं: - और दृश्य आकार प्रत्येक एनीमेशन चरण में परिवर्तन करेगा। लेकिन मैं इन परिवर्तनों का जवाब नहीं दे सकता - मेरा मतलब है, मैं प्रक्षेपण मैट्रिक्स को अपडेट कर सकता हूं, लेकिन अपडेट लागू नहीं होंगे, क्योंकि '-ड्राउरक्ट:' (और संबंधित जीएल ड्राइंग) एनीमेशन समाप्त होने तक कॉल नहीं किया जाएगा। – kpower

6

यह अंधेरे में एक शॉट हो सकता है के बाद से मैं GLKit साथ कोई अनुभव नहीं है, लेकिन मैं UIView और -drawRect: के साथ अनुभव नहीं है। देखने के contentMode बदलते प्रश्न में पुनः बनाने का प्रयास करें:

view.contentMode = UIViewContentModeRedraw;

यह दृश्य है कि यह यह सामग्री है जब यह सीमाओं को बदलने है पुनः बनाने की जरूरत बता देंगे। अन्यथा, UIView बस इसकी सामग्री को स्केल करने का प्रयास करेगा (सामग्री के लिए डिफ़ॉल्ट मोड UIViewContentModeScaleToFill है)। इसका कारण यह है कि सामग्रियों को फिर से निकालने के लिए क्या है और UIView को जितना संभव हो उतना कुशल बनाने के लिए डिज़ाइन करना बहुत आसान है।

+0

दुर्भाग्यवश, यह एक GLKView पर अभ्यास में कोई फर्क नहीं पड़ता प्रतीत होता है। – pmdj

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