2010-11-21 11 views
6

[प्रश्न अपडेट किया गया]लॉन्च पर इंटरफ़ेस अभिविन्यास का पता लगाने का सही तरीका क्या है?

तो यहां समस्या है, मैंने अंत में इसे कम कर दिया। आप सभी तरीकों

- (id)init; 
- (void)loadView; 
- (void)viewDidAppear:(BOOL)animated; 
- (void)viewDidLoad; 
(...) 

में एक नया UIViewController बनाते हैं मानक interfaceOrientation पोर्ट्रेट है और अगर लैंडस्केप मोड का पता चला है यह जल्दी है कि उन्मुखीकरण के लिए बारी बारी से होगा। जो तब का उपयोग कर पता लगाया जा सकता:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation; 

समस्या यह है कि आईपैड पर, यह loadView (या अन्य में से एक) के भीतर मौजूदा इंटरफ़ेस उन्मुखीकरण के लिए अपने इंटरफेस तैयार करने के लिए शांत मुश्किल है है के रूप में यह केवल वापस आ जाएगी पोर्ट्रेट। इससे कुछ समस्याएं पैदा होंगी:

1) मैं चाहता हूं कि मेरी सामग्री पोर्टेट मोड में पुनः लोड हो, लेकिन लैंडस्केप मोड में नहीं। आम तौर पर मैं loadView में एक if कथन रखता हूं। अगर पोर्ट्रेट मोड में, सामग्री पुनः लोड करें। लेकिन इस मामले में यह हमेशा पोर्ट्रेट लौटाएगा और इस तरह हमेशा सामग्री लोड करता है।

2) मैं 'presentPopoverFromRect: inView: allowArrowDirections: एनिमेटेड:' - विधि जब पोर्ट्रेट मोड में उपयोग करना चाहता है तो यह एप्लिकेशन प्रारंभ होने पर स्वचालित रूप से पॉपओवर मेनू पेश करेगा। पोर्ट्रेट मोड में लॉन्च होने पर यह एप्लिकेशन को क्रैश कर देगा। कारण: 'पॉपओवर को ऐसे दृश्य से प्रस्तुत नहीं किया जा सकता है जिसमें खिड़की नहीं है।'

एकमात्र सुरक्षित धारणा 'didRotateFromInterfaceOrientation: (UIInterfaceOrientation) इंटरफेसऑरिएंटेशन से है, लेकिन यह विधि पोर्ट्रेट मोड में लॉन्च होने पर निकाल दी जाएगी।

// ----

अद्यतन (15,37)

'UIApplicationWillChangeStatusBarOrientationNotification'

केवल तैनात किया जाएगा जब परिदृश्य (या vica विपरीत) चित्र से उपयोगकर्ता स्वैप। यदि इंटरफ़ेस समस्या तो यह आसानी से है कि अधिसूचना और

if (UIDeviceOrientationIsPortrait(interfaceOrientation)) { 
    // layout subviews for portrait mode 
} else { 
    // layout subviews for landscape mode 
} 

लेकिन समस्या के लिए अवलोकन के साथ हल किया जा सकता था कि मुझे पता है कि जो मोड में लॉन्च में है बल्कि यह निर्धारित करना चाहते हैं या नहीं मैं सामग्री को फिर से लोड करना चाहिए , मैं सामग्री को फिर से लोड नहीं कर सकता और जब यह परिदृश्य में बदल जाता है तो इसे रद्द कर दें।

+0

मैं() 'UIDeviceOrientationIsPortrait के लिए चेक' 'में एक कस्टम' UIView' उपवर्ग के layoutSubviews' और मैं सही झुकाव हो रही है कर की कोशिश की है। क्या आपके पास कुछ और कोड है जिसे आप साझा कर सकते हैं जो समस्या की पहचान करने में सहायता कर सकता है? यह भी सोच रहा है कि क्या UIDeviceOrientation और UIInterfaceOrientation मानों को एक दूसरे के लिए उपयोग किया जा रहा है? इससे पहले मुझे अजीब कीड़े से अटक गया है। – justinkmunger

उत्तर

8

[[UIApplication sharedApplication] statusBarOrientation] आज़माएं। को देख

typedef enum { 
    UIInterfaceOrientationPortrait   = UIDeviceOrientationPortrait, 
    UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown, 
    UIInterfaceOrientationLandscapeLeft  = UIDeviceOrientationLandscapeRight, 
    UIInterfaceOrientationLandscapeRight  = UIDeviceOrientationLandscapeLeft 
} UIInterfaceOrientation; 

और

typedef enum { 
    UIDeviceOrientationUnknown, 
    UIDeviceOrientationPortrait, 
    UIDeviceOrientationPortraitUpsideDown, 
    UIDeviceOrientationLandscapeLeft, 
    UIDeviceOrientationLandscapeRight, 
    UIDeviceOrientationFaceUp, 
    UIDeviceOrientationFaceDown 
} UIDeviceOrientation; 
faceup और मुंह के बल के बाद से

तो जोड़ा गया है:

+0

क्या यह [[यूआईएपीप्लिकेशन साझा अनुप्रयोग] स्थिति अलग है]? – Mark

+0

गह इसके बारे में खेद है। उत्तर अपडेट किया गया है। –

1

मुझे यकीन है कि अगर यह वास्तव में मेरे समस्या का समाधान है, लेकिन दस्तावेज़ को देखकर होगा नहीं कर रहा हूँ मैं निम्नलिखित पाया इंटरफेस कारणों के लिए डिवाइस का अभिविन्यास व्यर्थ है। इसके लिए, सैद्धांतिक रूप से, @ मार्क एडम्स सही मायने में उल्लेख कर रहे हैं कि [इस मामले में [[यूआईएपीप्लिकेशंस साझा एप्लाइजेशन] स्टेटस बैरऑरिएंटेशन] इंटरफ़ेस अभिविन्यास के लिए उपयोग किया जाना चाहिए।

या निश्चित रूप से UIViewController के पास 'इंटरफ़ेसऑरिएंटेशन' विकल्प है।

6

उचित तरीके से डिवाइस से इसकी ओरिएंटेशन के लिए तकनीकी रूप से कोई अभिविन्यास नहीं है, इसका उचित तरीका है। ;)

तो आप का उपयोग करने में सही हैं। documentation से आप देख सकते हैं कि इस जानकारी को सही करने से पहले आपको सबसे पहले डिवाइस अभिविन्यास अधिसूचनाएं उत्पन्न करने की आवश्यकता है। फिर यह वांछित के रूप में काम करेगा।

UIDevice *myDevice = [UIDevice currentDevice]; 
[myDevice beginGeneratingDeviceOrientationNotifications]; 
UIDeviceOrientation currentOrientation = [myDevice orientation]; 
[myDevice endGeneratingDeviceOrientationNotifications]; 

नोट: यह आपको उपकरण के वर्तमान उन्मुखीकरण देता है। यदि वर्तमान में दृश्यमान/शीर्ष दृश्य नियंत्रक इस अभिविन्यास पर रोटेशन की अनुमति नहीं देता है, तो भी आप वर्तमान डिवाइस अभिविन्यास प्राप्त करेंगे, न कि वर्तमान में सबसे ऊपर वाला दृश्य नियंत्रक जो उपयोग करता है।


संपादित के बाद सवाल अद्यतन किया गया था:

आप सही है कि सर्वोच्च दृश्य नियंत्रक के लिए अभिविन्यास (subview नियंत्रकों के लिए सही ढंग से काम किया) कर रहे हैं हमेशा 1 (अर्थात UIInterfaceOrientationPortrait) loadView में वापस आती है। हालांकि विधि willRotateToInterfaceOrientation:duration: तुरंत बाद में कॉल की जाएगी, और वहां पारित ओरिएंटेशन सही है, इसलिए आपको उस विधि का उपयोग करने में सक्षम होना चाहिए।

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toIfaceOrient 
           duration:(NSTimeInterval)duration 
+0

हे पास्कल, जो यूआईडीवीस के लिए काम करेगा हालांकि यह वह नहीं है जिसे मैं ढूंढ रहा हूं। अंततः मैंने बग को संकुचित कर दिया, मैं अपना प्रश्न अपडेट करूंगा। – Mark

+0

मैंने उत्तर अपडेट किया, शायद वह विधि आपकी समस्या का समाधान है। – Pascal

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