2012-08-23 16 views
51

मेरे पास एक ऐसा गेम है जिसमें डिवाइस का अभिविन्यास खेल की स्थिति को प्रभावित करता है। उपयोगकर्ता को लैंडस्केप, पोर्ट्रेट, और रिवर्स लैंडस्केप ओरिएंटेशन के बीच त्वरित रूप से स्विच करना होगा। अब तक मैं के माध्यम से उन्मुखीकरण सूचनाओं के लिए खेल पंजीकरण के किया गया है:आईओएस अभिविन्यास परिवर्तन तुरंत पता

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

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

+0

यहां आपको इसका उपयोग तब [लिंक] (http://stackoverflow.com/questions/5559652/how-do-i-detect-the-orientation- ऑफ-द-डिवाइस-ऑन-आईओएस)। अगर कोई संदेह है तो कृपया मुझे बताएं। – Sandy

+0

http://tech-blog.maddyzone.com/javascript/detect-orientation-event बहुत अच्छा आलेख –

उत्तर

22

देरी आप के बारे में बात कर रहे हैं वास्तव में रोकने के लिए एक फिल्टर है कि झूठी (अवांछित) अभिविन्यास परिवर्तन अधिसूचनाएं।

तत्काल डिवाइस अभिविन्यास परिवर्तन की पहचान आपको बस एक्सेलेरोमीटर की निगरानी करने की आवश्यकता होगी।

एक्सेलेरोमीटर सभी 3 अक्षों में त्वरण (गुरुत्वाकर्षण शामिल) को मापता है ताकि आपको वास्तविक अभिविन्यास को समझने में कोई समस्या न हो।

accelerometer के साथ काम शुरू करने के कुछ कोड यहां पाया जा सकता:

How to make an iPhone App – Part 5: The Accelerometer

और यह अच्छा ब्लॉग गणित भाग को शामिल किया गया:

Using the Accelerometer

+0

यूआईएक्सेलेरोमीटर को हटा दिया गया है और कोर मोशन –

+1

द्वारा प्रतिस्थापित किया गया है दूसरा लिंक टूटा हुआ है। –

21

तुम क्यों

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

का उपयोग didn `t?

या आप उपयोग कर सकते हैं इस

-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

या इस

-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 

आशा है कि यह उल्लू उपयोगी हो)

+8

इन विधियों को स्वचालित रूप से बाल दृश्य नियंत्रकों पर नहीं कहा जाएगा। –

+1

ये विधियां अब बहिष्कृत हैं। – Satyam

141

viewWillAppear समारोह में एक सूचक जोड़े

-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil]; 
} 

उन्मुखीकरण परिवर्तन इस समारोह को सूचित करता

- (void)orientationChanged:(NSNotification *)notification{ 
    [self adjustViewsForOrientation:[[UIApplication sharedApplication] statusBarOrientation]]; 
} 

जिसमें बारी इस समारोह जहां moviePlayerController फ्रेम उन्मुखीकरण नियंत्रित किया जाता है

- (void) adjustViewsForOrientation:(UIInterfaceOrientation) orientation { 

    switch (orientation) 
    { 
     case UIInterfaceOrientationPortrait: 
     case UIInterfaceOrientationPortraitUpsideDown: 
     { 
     //load the portrait view  
     } 

      break; 
     case UIInterfaceOrientationLandscapeLeft: 
     case UIInterfaceOrientationLandscapeRight: 
     { 
     //load the landscape view 
     } 
      break; 
     case UIInterfaceOrientationUnknown:break; 
    } 
} 

viewDidDisappear में हटाने है कॉल अधिसूचना

-(void)viewDidDisappear:(BOOL)animated{ 
    [super viewDidDisappear:animated]; 
    [[NSNotificationCenter defaultCenter]removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; 
} 

मुझे लगता है कि इस प्रति उन्मुखीकरण

+4

असली प्रोग्रामर जैसे प्रतिलिपि पेस्ट के मामले में [सुपर व्यूविल्लएपियर: एनिमेटेड] और [सुपर व्यूडिड डिस्प्लेयर: एनिमेटेड] को न भूलें। –

+0

नोट: UIDeviceOrientation! = UIInterfaceOrientation। – nnrales

5

में अपने परिवर्तन करने का प्रयास के रूप में देखें सबसे तेजी से यू बदल दिया है सकते हैं:

- (void) viewWillLayoutSubviews {}

कोड चलेंगे प्रत्येक अभिविन्यास में परिवर्तन के रूप में सबव्यूज़ फिर से बाहर निकलते हैं।

5

@ विमल उत्तर ने मेरे लिए समाधान प्रदान नहीं किया। ऐसा लगता है कि अभिविन्यास वर्तमान अभिविन्यास नहीं है, बल्कि पिछले अभिविन्यास से है। इसे ठीक करने के लिए, मैं का उपयोग [[UIDevice currentDevice] orientation]

- (void)orientationChanged:(NSNotification *)notification{ 
    [self adjustViewsForOrientation:[[UIDevice currentDevice] orientation]]; 
} 

फिर

- (void) adjustViewsForOrientation:(UIDeviceOrientation) orientation { ... } 

इस कोड को मैं वर्तमान अभिविन्यास स्थान प्राप्त है।

10

मेरे मामले हैंडलिंग UIDeviceOrientationDidChangeNotification के लिए अच्छा समाधान नहीं था क्योंकि इसे अधिक बार कहा जाता है और UIDeviceOrientation हमेशा UIInterfaceOrientation के बराबर नहीं होता है (फेसडाउन, फेसअप)।

मैं इसे UIApplicationDidChangeStatusBarOrientationNotification का उपयोग कर संभाल:

//To add the notification 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeOrientation:) 

//to remove the 
[[NSNotificationCenter defaultCenter]removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; 

... 

- (void)didChangeOrientation:(NSNotification *)notification 
{ 
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 

    if (UIInterfaceOrientationIsLandscape(orientation)) { 
     NSLog(@"Landscape"); 
    } 
    else { 
     NSLog(@"Portrait"); 
    } 
} 

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

  • कोई संबंधित समस्या नहीं^_^