2009-07-21 22 views
12

घूर्णन मेरा कार्यक्रम में मैं रोटेशन के आधार पर बातें चलती हूँ से पहले iPhone उन्मुखीकरण का पता लगाने है, लेकिन मैं पूरे दृश्य घूर्णन नहीं कर रहा हूँ। मैं का उपयोग कर रहा हूँ:कैसे मैं

static UIDeviceOrientation previousOrientation = UIDeviceOrientationPortrait; 

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    [window addSubview:viewController.view]; 
    [window makeKeyAndVisible]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(didRotate:) 
      name:@"UIDeviceOrientationDidChangeNotification" object:nil]; 

} 

- (void) didRotate:(NSNotification *)notification{ 
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 

    [self doRotationStuff:orientation: previousOrientation]; 
previousOrientation = orientation; 

} 

इस के रूप में, जब कार्यक्रम का शुभारंभ किया है, जब तक काम करता है, डिवाइस अभिविन्यास चित्र है, लेकिन नहीं करता है, तो प्रारंभिक उन्मुखीकरण परिदृश्य है या उलटे, क्योंकि [आत्म doRotationStuff] परिवर्तन रिश्तेदार बनाता है पिछले उन्मुखीकरण से अंतर के लिए।

वहाँ उन्मुखीकरण या तो शुरुआत में पता लगाने के लिए एक रास्ता है, या सही से पहले डिवाइस घुमाया जाता है?

उत्तर

3

अपडेट किया गया:

तो, टिप्पणी चर्चा से, ऐसा लगता है कि आप [UIDevice currentDevice].orientation पर भरोसा नहीं कर सकते जब तक उन्मुखीकरण वास्तव में पहली बार के लिए बदल जाता है। यदि ऐसा है, तो आप शायद कच्चे accelerometer रीडिंग प्राप्त करके इसे हैक कर सकते हैं।

#define kUpdateFrequency 30 // Hz 
#define kUpdateCount 15 // So we init after half a second 
#define kFilteringFactor (1.0f/kUpdateCount) 

- (void)applicationDidFinishLaunching:(UIApplication *)app 
{ 
    [UIAccelerometer sharedAccelerometer].updateInterval = (1.0/kUpdateFrequency); 
    [UIAccelerometer sharedAccelerometer].delegate = self; 
    accelerometerCounter = 0; 
    ... 
} 

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)accel 
{ 
    // Average out the first kUpdateCount readings 
    // acceleration_[xyz] are ivars typed float 
    acceleration_x = (float)accel.x * kFilteringFactor + acceleration_x * (1.0f - kFilteringFactor); 
    acceleration_y = (float)accel.y * kFilteringFactor + acceleration_y * (1.0f - kFilteringFactor); 
    acceleration_z = (float)accel.z * kFilteringFactor + acceleration_z * (1.0f - kFilteringFactor); 

    accelerometerCounter++; 
    if (accelerometerCounter == kUpdateCount) 
    { 
     [self initOrientation]; 
     [UIAccelerometer sharedAccelerometer].delegate = nil; 
    } 
} 

- (void)initOrientation 
{ 
    // Figure out orientation from acceleration_[xyz] and set up your UI... 
} 

मूल प्रतिक्रिया:

[UIDevice currentDevice].orientationapplicationDidFinishLaunching: दौरान सही ओरिएंटेशन वापसी करता है? यदि ऐसा है, तो आप उस ओरिएंटेशन के अनुसार अपना प्रारंभिक यूआई सेट अप कर सकते हैं।

यदि वह संपत्ति कुछ समय बाद सेट नहीं होती है, तो आप थोड़ी देर के बाद यूआई को आरंभ करने के लिए performSelector:afterDelay: के साथ प्रयोग करने का प्रयास कर सकते हैं।

इस कोड नमूना है से नीचे केंडल जवाब, पूर्णता के लिए यहां कहा:

[self performSelector:@selector(getOriented) withObject:nil afterDelay:0.0f]; 

मुझे यकीन है कि अगर एक शून्य सेकंड की देरी के लिए पर्याप्त है नहीं कर रहा हूँ - इसका मतलब है getOriented के लिए कोड के दौरान चलेंगे पहले घटना रन लूप के माध्यम से गुजरती हैं। पर पंजीकरण करने के लिए आपको एक्सेलेरोमीटर रीडिंग के लिए लंबे समय तक इंतजार करना पड़ सकता है।

+0

applicationDidFinishLaunching के दौरान, [UIDevice currentDevice] .orientation UIDeviceOrientationUnknown –

+0

मैं कैसे मैं performSelector का प्रयोग करेंगे के बारे में पता कर रहा हूँ है। क्या आप एक कोड उदाहरण दे सकते हैं? –

+0

मैंने कोशिश की कि आपने क्या कहा लेकिन यहां तक ​​कि [स्वयं प्रदर्शन चयनकर्ता: @ चयनकर्ता (getOriented) के साथ ऑब्जेक्ट: शून्य बाद: 10.0f]; इसका कोई प्रभाव नहीं पड़ा –

-1

अपनी टिप्पणी के जवाब में, मैंने सोचा कि मैं बेहतर यहाँ कोड डाल सकता है की तुलना में एक टिप्पणी में (हालांकि वास्तव में डैनियल यहाँ श्रेय):

applicationDidFinishLaunching में

:

[self performSelector:@selector(getOriented) withObject:nil afterDelay:0.0f]; 

तो फिर तुम बस जरूरत है कॉल करने के लिए विधि:

- (void) getOriented 
{ 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 
    // save orientation somewhere 
} 
+0

मैंने जो कहा है, मैंने कोशिश की लेकिन यहां तक ​​कि [स्वयं प्रदर्शन चयनकर्ता: @ चयनकर्ता (getOriented) के साथ ऑब्जेक्ट: nil afterDelay: 10.0f]; कोई प्रभाव नहीं पड़ा –

+0

अभिविन्यास क्या था जब इसे दस सेकंड बाद कहा जाता था? ऐसा लगता है कि दस सेकंड के बाद अभिविन्यास सेट किया जाना चाहिए ... या उस समय, मुख्य दृश्य नियंत्रक से पूछें कि इसका अभिविन्यास क्या है। –

+0

यह UIDeviceOrientation अज्ञात –

1

मोर्ट, ये उत्तर लाल हेरिंग के कुछ हद तक प्रतीत होते हैं; मैं नहीं देख सकते हैं कि आप एक UIViewController वर्ग के लिए निम्नलिखित में निर्मित विधि का उपयोग नहीं कर सकते हैं:

-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {} 

इस विधि स्वचालित रूप से कहा जाता हो जाता है के बाद एक रोटेशन (आ गई है बल्कि shouldAutorotateToInterfaceOrientation जो केवल आपको बताता है के साथ तुलना में इसके बारे में होना)। हाथ से, परिवर्तनीय 'सेInterfaceOrientation' में पिछले अभिविन्यास शामिल है। जैसा कि दस्तावेज़ भी कहता है, आप यह मान सकते हैं कि दृश्य की इंटरफ़ेसऑरिएंटेशन प्रॉपर्टी पहले से ही नए अभिविन्यास पर सेट कर दी गई है, इसलिए आपके पास पुराने अभिविन्यास और नए तक पहुंच के साथ एक विधि है!

अगर मुझे कुछ याद आया है और आप इस विधि का उपयोग करने में सक्षम होने से पहले ही खारिज कर चुके हैं, मेरी माफ़ी! यह अजीब लगता है कि आप उपरोक्त विधि में मुफ्त में प्रदान किए जाने पर "पिछले अभिविन्यास" के लिए एक चर बना रहे हैं और संग्रहीत कर रहे हैं।

आशा है कि मदद करता है!

+0

यह काम करेगा अगर मैं इंटरफ़ेस घूर्णन करने की योजना बना रहा था, जिसे मैं नहीं करना चाहता। –

0

कैसे त्वरक रीडिंग से डिवाइस अभिविन्यास प्राप्त करने के लिए पर एक और पूरी उदाहरण पाया जा सकता है here समाधान त्वरक रीडिंग पर निर्भर करता है के रूप में, यह सिम्युलेटर पर काम नहीं होता है, तो आप डिवाइस पर काम करना होगा। .. अभी भी एक समाधान के लिए खुद को देख रहा है जो सिम्युलेटर पर काम करता है।

12

आपकी परिस्थितियों के आधार पर, एक आसान विकल्प UIViewController क्लास की इंटरफ़ेसऑरिएंटेशन प्रॉपर्टी हो सकती है। यह एक घूर्णन से पहले सही है।

+2

धन्यवाद! मुझे नहीं पता था कि एचटीएटी क्षेत्र अस्तित्व में था - मैं यूआईडीवीस के अभिविन्यास का उपयोग कर रहा था, जो बहुत उपयोगी नहीं था। – Chris

+0

यही कारण है कि *** एसओ चट्टानों! *** ... एक * * खांसी * * सरल अभिविन्यास समस्या हल करने की कोशिश कर रहा है Nugging Futz जा रहा था ... कोई सुराग ... खोज delany के जवाब बदल जाता है। –

1

यूआई के अभिविन्यास के लिए इसका उपयोग करें यदि आपको यह निर्धारित करने की आवश्यकता है कि आप किस तरह से इंगित कर रहे हैं।

नहीं 100% यकीन है कि यह सही है, लेकिन मेरे सिर के ऊपर से जा रहा:

[[[UIApplication sharedApplication] statusBar] orientation] 
1

यहाँ एक ही रास्ता है कि एप्लिकेशन को पहली बार लोड और UIDeviceOrientation UIDeviceOrientationUnknown पर सेट किया जाता उन्मुखीकरण पाने के लिए है। आप घूर्णन दृश्य की रूपांतरित संपत्ति को देख सकते हैं। afterDelay:

if(toInterface == UIDeviceOrientationUnknown) { 
    CGAffineTransform trans = navigationController.view.transform; 
    if(trans.b == 1 && trans.c == -1) 
     toInterface = UIDeviceOrientationLandscapeLeft; 
    else if(trans.b == -1 && trans.c == 1) 
     toInterface = UIDeviceOrientationLandscapeRight; 
    else if(trans.a == -1 && trans.d == -1) 
     toInterface = UIDeviceOrientationPortraitUpsideDown; 
    else 
     toInterface = UIDeviceOrientationPortrait; 
} 
+0

यह सोना है! यह आपको एक दृश्य का अभिविन्यास देगा। मैंने अपने पिछले अभिविन्यास का पता लगाने के लिए 'UIDeviceOrientationDidChangeNotification' के साथ इसका उपयोग किया। – cnotethegr8