2010-02-03 12 views
6

ठीक है के लिए autorotate अक्षम करना, इस तरह यह अपेक्षाकृत आसान होना चाहिए लगता है, लेकिन मैं एक घंटे के अधिकतर हिस्से के लिए Googling गया है, और मैं क्या जरूरत है खोजने के लिए प्रतीत नहीं कर सकते हैं। एक पृष्ठभूमि देखने के लिए, एक हैडर देखने के लिए, और कुछ बटन:एक भी UIView

मैं एक दृश्य नियंत्रक कुछ अलग भागों में है कि नहीं है। अब, मैं हेडर और बटन को सही ढंग से ऑटोरोटेट करना चाहता हूं (वे करते हैं, जब मैं YAAutorotateToInterfaceOrientation :) से YES वापस करता हूं, लेकिन किसी भी परिस्थिति में पृष्ठभूमि दृश्य घूमना नहीं चाहिए। क्या ऐसा करने का कोई सही तरीका है?

उत्तर

5

आप नहीं के अस्थायी रोटेशन चाहते हैं बैकग्राउंड व्यू जिसके बाद पृष्ठभूमि को सही अभिविन्यास के लिए बदल दिया गया है, आपको दृश्य के लिए ऑटोरोटेशन बंद करना होगा। इसमें कोई संदेह नहीं है।

आप बटन खुद के रोटेशन को संभालने के लिए की आवश्यकता होगी। आप या तो एक अच्छा लेआउट बना सकते हैं या उदाहरण के लिए उन्हें स्क्रॉलव्यू डाल सकते हैं और बस इसका आकार बदल सकते हैं।

किसी भी तरह से, आप, यह अपने आप को बारी बारी से करने एक पर्यवेक्षक जोड़ने की जरूरत होगी

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

और didRotate में आप एक अच्छे एनिमेटेड संक्रमण के साथ आकार बदलने करते हैं, यदि आप चाहें तो।

- (void) didRotate:(NSNotification *)notification { 
int ori=1; 
    UIDeviceOrientation currOri = [[UIDevice currentDevice] orientation]; 
    if ((currOri == UIDeviceOrientationLandscapeLeft) || (currOri == UIDeviceOrientationLandscapeRight)) ori=0; 
} 

आशा है कि आपको यह पसंद आएगा। यदि नेविगेशन बार या स्टेटस बार शीर्ष बार के नीचे दृश्य को देखने के लिए कारण बनते हैं, तो इसे ठीक करने के तरीके हैं।

+0

इसे पोस्ट करने के लिए धन्यवाद, यह एक बड़ा मुद्दा हल किया गया था। हालांकि, मुझे इसे लागू करने में एक छोटी सी समस्या है, क्या आप यहां मेरी पोस्ट देख सकते हैं: [link] (http://stackoverflow.com/questions/8114445/app-rotates-incorrectly-when-locked)? – robhasacamera

1

मैं एक 'उचित' तरीके के बारे में पता नहीं है, लेकिन एक काम के आसपास पृष्ठभूमि बनाने के लिए है दोनों झुकाव में छवि होड़ करना और बस पृष्ठभूमि दृश्य बदल जाते हैं। हालांकि अच्छा सवाल - यह देखने में दिलचस्पी होगी कि लोग समाधान के साथ क्या आते हैं।

2

है कि चारों ओर एक और काम के बारे में मैं सोचा है है ...

आप इस्तेमाल कर सकते हैं:

bgView.transform = CGAffineTransformMakeRotate(angle); 

आप उन्मुखीकरण के अनुसार कोण की गणना करना चाहिए (यह हो सकता है M_PI/2 , M_PI या 3 * M_PI/2) ...

आप - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration अंदर इस फ़ंक्शन का उपयोग और भी एक एनीमेशन है कि स्क्रीन अभिविन्यास एनीमेशन के रूप में सटीक अवधि के लिए चेतन जाएगा साथ लपेट कर सकते हैं:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    // Decide what will be the angle... 

    // Make the animation 
    [UIView beginAnimations:@"orientationChange" context:nil]; 
    [UIView setAnimationDuration: duration]; 
    bgView.transform = CGAffineTransformMakeRotate(angle); 
    [UIView commitAnimations]; 
} 

सूचना दृश्य के आकार ऊपर पट्टी की वजह से बदला जा सकता है ...

सूचना भी है कि मैं इसे अपने आप को कभी नहीं आज़माया ...

2

एक 'उचित' तरीका है: फ्रेमवर्क को इंटरफ़ेस को घुमाने के लिए अनुमति दें (अन्यथा आप किसी अन्य दृश्य नियंत्रक को पॉप अप करते समय समस्याओं में भाग लेंगे) लेकिन आपके दृश्य की एनीमेशन को ओवरराइड करें।

मैं एक पूर्ण स्क्रीन दृश्य सब कुछ मैं बारी बारी से नहीं करना चाहते हैं, _fixedView कहा जाता है कि है। स्टोरीबोर्ड में मैंने सुनिश्चित किया कि सभी ऑटोोज़ाइजिंग ('आकार निरीक्षक' पर उन लाल तीरों को बंद कर दिया गया है, इसलिए दृश्य हमेशा स्क्रीन के केंद्र में होगा।_fixedView में

-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [UIView animateWithDuration:duration 
        animations:^{ 
     if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) { 
      _fixedView.transform = CGAffineTransformMakeRotation(M_PI_2); 
     } else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
      _fixedView.transform = CGAffineTransformMakeRotation(-M_PI_2); 
     } else if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { 
      _fixedView.transform = CGAffineTransformMakeRotation(M_PI); 
     } else { 
      _fixedView.transform = CGAffineTransformIdentity; 
     }}]; 
} 

इस तरह सब कुछ पूरी तरह से तय हो गई है (कैसे कि वर्णनात्मक नाम के लिए, हाँ है?) स्थिति पट्टी और मेरे उपकरण पट्टी सामान्य रूप से बारी बारी से एक ओर जहां:

तो मेरे विचार नियंत्रक में मैं इस ओवरराइड है।