क्या iPhone अभिविन्यास सेट करने के लिए एक प्रलेखित तरीका है?


94

मेरे पास एक ऐप है जहां मैं कुछ विचारों में डिवाइस रोटेशन का समर्थन करना चाहता हूं, लेकिन अन्य विशेष रूप से लैंडस्केप मोड में कोई मतलब नहीं है, इसलिए जैसे ही मैं विचारों को स्वैप कर रहा हूं मैं रोटेशन को पोर्ट्रेट के लिए सेट करने के लिए मजबूर करना चाहूंगा।

UIDevice पर एक अनिर्दिष्ट संपत्ति सेटर है जो चाल करता है लेकिन स्पष्ट रूप से एक संकलक चेतावनी उत्पन्न करता है और एसडीके के भविष्य के संशोधन के साथ गायब हो सकता है।

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];

क्या अभिविन्यास के लिए कोई प्रलेखित तरीके हैं?

अद्यतन: मैंने सोचा था कि मैं एक उदाहरण प्रदान करूंगा क्योंकि मैं shouldAutorotateToInterfaceOrientation की तलाश नहीं कर रहा हूं क्योंकि मैंने पहले ही इसे लागू कर दिया है।

मैं चाहता हूं कि मेरा ऐप दृश्य 1 में परिदृश्य और चित्र का समर्थन करे, लेकिन दृश्य 2 में केवल चित्र। मैंने पहले ही सभी विचारों के लिए shouldAotorotateToInterfaceOrientation लागू कर दिया है, लेकिन यदि उपयोगकर्ता दृश्य 1 में परिदृश्य मोड में है और फिर दृश्य 2 पर स्विच करता है, तो मैं बाध्य करना चाहता हूं पोर्ट्रेट को वापस घुमाने के लिए फोन।


11
मैंने इस पर एक बग दर्ज किया है, जिसमें सुझाव दिया गया है कि Apple या तो उपरोक्त API को उजागर करे, या हाँ का सम्मान करे, NO को शोल्डर विधि से वापस लौटाया जाए, जब कोई दृश्य पहले लोड होता है, न कि केवल जब फोन घूमता है।
सरसराहट

2
मैंने एक बग दर्ज किया है जिसमें कहा गया है कि सेटऑवरेंटेशन को उजागर किया जाए
जेसडेक

1
[[UIDevice currentDevice] setOrientation: UIInterfaceOrientationPortrait]; यह विधि पदावनत है और किसी भी अधिक मौजूद नहीं है।
हिकमत खान

जवाबों:


6

यह बाद के iPhone 3.1.2 SDK पर कोई समस्या नहीं है। यह अब स्टैक पर वापस धकेले जा रहे दृश्य के अनुरोध के उन्मुखीकरण का सम्मान करता है। इस संभावना का मतलब है कि आपको पुराने iPhone OS संस्करणों का पता लगाने की आवश्यकता होगी और केवल नवीनतम रिलीज से पहले सेटऑट्रिएशन लागू करें।

यह स्पष्ट नहीं है कि क्या ऐप्पल का स्थैतिक विश्लेषण समझ जाएगा कि आप पुराने एसडीके सीमाओं के आसपास काम कर रहे हैं। मुझे व्यक्तिगत रूप से Apple द्वारा मेरे अगले अपडेट पर विधि कॉल को हटाने के लिए कहा गया है, इसलिए मुझे अभी तक यकीन नहीं है कि पुराने उपकरणों के लिए एक हैक होने की मंजूरी प्रक्रिया के माध्यम से मिलेगा।


यह iPhone सिम्युलेटर 3.3.2 के मामले में नहीं है। यह अभी भी काम नहीं कर रहा है।
बतख

4
@user जब आप स्टैक पर कोई दृश्य देखते हैं, तो आप एक अभिविन्यास का अनुरोध कैसे करते हैं?
प्रात:

4
आप Apple के स्थैतिक विश्लेषण के आसपास हो सकते हैं। मैं सफलतापूर्वक निष्पादक कोड का उपयोग करके PerformSelector का उपयोग करके और Obj-C के भयानक गतिशीलता पर भरोसा करता हूं।
केनेथ बॉलनेगर

@KennethBallenegger मुझे दिशानिर्देशों और / या समझौते में पढ़ना याद है जो इस तरह से सामान छिपा रहे हैं कि आपके ऐप को हटा दिया जाए और शायद आपका खाता भी हटा दिया जाए। मुझे लगता है कि बस अनिर्दिष्ट एपीआई का उपयोग करने के लिए जोखिम नहीं होगा।
इवान वुज़िका 18

101

यह तथ्य के बाद लंबे समय से है, लेकिन सिर्फ मामले में कोई भी साथ आता है जो एक नेविगेशन नियंत्रक का उपयोग नहीं कर रहा है और / या अनिर्दिष्ट विवरण का उपयोग नहीं करना चाहता है:

UIViewController *c = [[UIViewController alloc]init];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
[c release];

यह एक वेनिला दृश्य नियंत्रक को पेश करने और खारिज करने के लिए पर्याप्त है।

जाहिर है आपको अभी भी पुष्टि करने की आवश्यकता होगी या आपके ओवरराइड ऑफ कन्डर को चाहिए। लेकिन इसके कारण सिस्टम को फिर से कॉल किया जाना चाहिए।


1
बहुत बढ़िया, यह इस पोस्ट के सही उत्तर के रूप में चिह्नित नहीं है, लेकिन इससे मेरी आधी समस्या stackoverflow.com/questions/5030315 में हल हो गई । मॉडल व्यू ट्रिक 'फोर्स' पोर्ट्रेट ओरिएंटेशन, क्या आप लैंडस्केप को मजबूर करने के लिए भी जानते होंगे?
उपसंहार

5
हह हह !! यह सिर्फ बेवकूफ है! लेकिन यह काम करता है! - बिलकुल यह करता है! : डी
hfossli

बहुत समय से इससे जूझ रहे थे। धन्यवाद! मेट
राहुल चौधरी

3
यह iOS5 और iOS6 दोनों के लिए काम करने लगता है: [self presentViewController: [UIViewController new] एनिमेटेड: NO पूर्णता: ^ {[स्व बरगला देखनेवालाअनुरोधी: NO पूरा: nil]; }];
इंफ़रिस

1
यह आईओएस 7 और आईओएस 8 पर काम करता प्रतीत होता है, लेकिन ध्यान देने योग्य ब्लैक स्क्रीन है जो मुख्य रूप से फ़्लिकर करता है (आईओएस 8 मुख्य रूप से)।
लेविग्रोकर

16

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

if(UIInterfaceOrientationIsLandscape(self.interfaceOrientation)){

        [UIView beginAnimations:@"View Flip" context:nil];
        [UIView setAnimationDuration:0.5f];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
        self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
        self.view.center = CGPointMake(160.0f, 240.0f);

        [UIView commitAnimations];
}

यह भी काम करेगा अगर मैं एक UIAlertView जोड़ा? मैंने कोशिश की CGAffineTransformMakeRotationकि दृश्य घुमाया जाए लेकिन UIAlertView अभी भी स्टेटस बार ओरिएंटेशन के अनुसार है, -DgreeToRadian (कोण)? क्या आपको ऐसा कुछ मिला?
नेवरहॉल

एक के साथ ऐसा करने का सबसे आसान तरीका है कि आप UIAlertViewअपने दृश्य नियंत्रक को अलर्टव्यू के प्रतिनिधि के रूप में सेट करें और फिर: - (void) didPresentAlertView:(UIAlertView *) alertViewआप वर्तमान के आधार पर रोटेशन करते हैं [UIApplication sharedApplication].statusBarOrientation। यदि आप इसे चेतन नहीं करते हैं, तो बहुत अजीब नहीं लगना चाहिए।
माइकल गेलॉर्ड

16

मैं जो बता सकता हूं, वह setOrientation:विधि काम नहीं करती है (या शायद अब काम नहीं करती है)। यहाँ मैं यह करने के लिए क्या कर रहा हूँ:

सबसे पहले, इसे अपनी फ़ाइल के शीर्ष पर, अपने #imports के ठीक नीचे रखें:

#define degreesToRadian(x) (M_PI * (x) / 180.0)

फिर, viewWillAppear:विधि में

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];     
if (self.interfaceOrientation == UIInterfaceOrientationPortrait) {  
    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
    self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
}

यदि आप चाहते हैं कि एनिमेटेड हो, तो आप पूरी चीज़ को एनीमेशन ब्लॉक में लपेट सकते हैं, जैसे:

[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:1.25];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];     
if (self.interfaceOrientation == UIInterfaceOrientationPortrait) {  
    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
    self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
}
[UIView commitAnimations];

फिर, अपने पोर्ट्रेट मोड कंट्रोलर में, आप रिवर्स - चेक कर सकते हैं कि यह देखने के लिए कि क्या वर्तमान में लैंडस्केप में है, और यदि ऐसा है, तो इसे पोर्ट्रेट पर वापस घुमाएँ।


1
Self.view के बजाय आपको self.window.view को घुमाना चाहिए। यदि आपके पास UITabBar या आपके दृष्टिकोण के शीर्ष पर अन्य नियंत्रक हैं तो यह आसान है।
बोरुत टोमाज़िन

7

मैं एक ऐसा मुद्दा UIViewControllerरख रहा था जहाँ मैं स्क्रीन पर, UINavigationControllerलैंडस्केप ओरिएंटेशन में, स्क्रीन पर था । जब अगला दृश्य नियंत्रक प्रवाह में धकेल दिया जाता है, हालांकि, मुझे चित्र अभिविन्यास पर लौटने के लिए डिवाइस की आवश्यकता थी।

मैंने जो देखा, वह यह था कि shouldAutorotateToInterfaceOrientation:जब नया व्यू कंट्रोलर स्टैक पर धकेल दिया जाता है तो वह विधि नहीं कहलाती, लेकिन स्टैक से व्यू कंट्रोलर पॉप होने पर इसे कहा जाता है

इसका लाभ उठाते हुए, मैं अपने एक ऐप में कोड के इस स्निपेट का उपयोग कर रहा हूं:

- (void)selectHostingAtIndex:(int)hostingIndex {

    self.transitioning = YES;

    UIViewController *garbageController = [[[UIViewController alloc] init] autorelease];
    [self.navigationController pushViewController:garbageController animated:NO];
    [self.navigationController popViewControllerAnimated:NO];

    BBHostingController *hostingController = [[BBHostingController alloc] init];
    hostingController.hosting = [self.hostings objectAtIndex:hostingIndex];
    [self.navigationController pushViewController:hostingController animated:YES];
    [hostingController release];

    self.transitioning = NO;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    if (self.transitioning)
        return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
    else
        return YES;
}

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


नमस्ते, मैंने इसे ठीक करने से पहले वीसी को सही उन्मुखीकरण के लिए बाध्य करने के लिए आपकी विधि को लागू किया, लेकिन मैंने पाया है कि यह केवल तब काम करता है जब पोर्ट्रेट ओरिएंटेशन मजबूर करता है (यदि वर्तमान दृश्य पोर्ट्रेट है और आप परिदृश्य में अगले को मजबूर करना चाहते हैं, तो यह जीत गया 't call shouldAutorotateToInterfaceOrientation: जब popping)। क्या आपने लैंडस्केप के लिए एक दृश्य को मजबूर करने के लिए वर्कअराउंड पाया?
राफेल नोब्रे

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

7

प्रोग्राम को अनिवार्य रूप से iPhone को आवश्यक अभिविन्यास के लिए मजबूर करने का एक सरल तरीका है - kdbdallas द्वारा दो पहले से ही दिए गए उत्तर का उपयोग करते हुए , जोश :

//will rotate status bar
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];


//will re-rotate view according to statusbar
UIViewController *c = [[UIViewController alloc]init];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
[c release];

एक जादू की तरह काम करता है :)

संपादित करें:

iOS 6 के लिए मुझे इस फ़ंक्शन को जोड़ने की आवश्यकता है: (मोडल व्यूकंट्रोलर पर काम करता है)

- (NSUInteger)supportedInterfaceOrientations
{
    return (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight);
}

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

यह मेरे अंत पर काम करता है, दोनों मोडल और धकेलने वाले व्यू कॉन्ट्रैक्टर पर। लेकिन केवल iOS 5. :( पर
गुंटिस Treulands

हाँ, मुझे यह ios5 में काम करने के लिए मिला, भी। अब ios6 में नेविगेशन बार की ऊँचाई सिकुड़ जाती है जब एक बार लैंडस्केप व्यू कंट्रोलर खारिज हो जाता है
AlexWien

7

मैं खुदाई कर रहा हूं और इस के लिए एक अच्छा समाधान तलाश कर रहा हूं। इस ब्लॉग पोस्ट को मिला जो ट्रिक करता है: अपने बाहरी दृश्य को कुंजी से हटा दें UIWindowऔर इसे फिर से जोड़ें, सिस्टम फिर shouldAutorotateToInterfaceOrientation:आपके दृष्टिकोण के तरीकों को फिर से क्वेरी करेगा , जो लागू होने के लिए सही अभिविन्यास को लागू करेगा। इसे देखें: iphone मजबूर करने के लिए पुनर्जीवित करने के लिए


इस समाधान ने मेरे लिए सबसे अच्छा काम किया। महत्वपूर्ण रूप से, फिक्स जो खाली modalViewController प्रस्तुत करता है, स्टैक पर व्यूकंट्रोलर्स को धक्का देने का गलत एनीमेशन का कारण बनता है। यह UIWindow विधि समान समस्या से ग्रस्त नहीं है।
रिक स्मिथ-उन्ना सेप

5

जोश का जवाब मेरे लिए ठीक काम करता है।

हालाँकि, मैं "ओरिएंटेशन चेंज, यूआई अपडेट करें" अधिसूचना पोस्ट करना पसंद करता हूँ । जब यह नोटिफिकेशन किसी व्यू कंट्रोलर द्वारा प्राप्त किया जाता है, तो यह आपको कॉल करता है shouldAutorotateToInterfaceOrientation:, जिससे आप अपने YESइच्छित ओरिएंटेशन के लिए वापस आकर किसी भी ओरिएंटेशन को सेट कर सकते हैं।

[[NSNotificationCenter defaultCenter] postNotificationName:UIDeviceOrientationDidChangeNotification object:nil];

एकमात्र समस्या यह है कि यह एक एनीमेशन के बिना फिर से उन्मुखीकरण को मजबूर करता है । आप के बीच इस लाइन को लपेटने beginAnimations:और commitAnimationsएक चिकनी संक्रमण प्राप्त करने की आवश्यकता होगी ।

उम्मीद है की वो मदद करदे।


3

एफडब्ल्यूआईडब्ल्यू, यहां मैन्युअल रूप से सेटिंग ओरिएंटेशन का मेरा कार्यान्वयन (आपके ऐप के रूट व्यू कंट्रोलर में जाना, नैच):

-(void)rotateInterfaceToOrientation:(UIDeviceOrientation)orientation{

    CGRect bounds = [[ UIScreen mainScreen ] bounds ];
    CGAffineTransform t;
    CGFloat r = 0;
    switch ( orientation ) {
        case UIDeviceOrientationLandscapeRight:
            r = -(M_PI / 2);
            break;
        case UIDeviceOrientationLandscapeLeft:
            r  = M_PI / 2;
            break;
    }
    if( r != 0 ){
        CGSize sz = bounds.size;
        bounds.size.width = sz.height;
        bounds.size.height = sz.width;
    }
    t = CGAffineTransformMakeRotation( r );

    UIApplication *application = [ UIApplication sharedApplication ];

    [ UIView beginAnimations:@"InterfaceOrientation" context: nil ];
    [ UIView setAnimationDuration: [ application statusBarOrientationAnimationDuration ] ];
    self.view.transform = t;
    self.view.bounds = bounds;
    [ UIView commitAnimations ];

    [ application setStatusBarOrientation: orientation animated: YES ];     
}

निम्नलिखित UINavigationControllerDelegateविधि के साथ युग्मित (मान लें कि आप उपयोग कर रहे हैं UINavigationController):

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
    // rotate interface, if we need to
    UIDeviceOrientation orientation = [[ UIDevice currentDevice ] orientation ];
    BOOL bViewControllerDoesSupportCurrentOrientation = [ viewController shouldAutorotateToInterfaceOrientation: orientation ];
    if( !bViewControllerDoesSupportCurrentOrientation ){
        [ self rotateInterfaceToOrientation: UIDeviceOrientationPortrait ];
    }
}

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

-(void)onUIDeviceOrientationDidChangeNotification:(NSNotification*)notification{
    UIViewController *tvc = self.rootNavigationController.topViewController;
    UIDeviceOrientation orientation = [[ UIDevice currentDevice ] orientation ];
    // only switch if we need to (seem to get multiple notifications on device)
    if( orientation != [[ UIApplication sharedApplication ] statusBarOrientation ] ){
        if( [ tvc shouldAutorotateToInterfaceOrientation: orientation ] ){
            [ self rotateInterfaceToOrientation: orientation ];
        }
    }
}

अंत में, UIDeviceOrientationDidChangeNotificationनोटिफिकेशन के लिए रजिस्टर करें initया loadviewऐसा करें:

[[ NSNotificationCenter defaultCenter ] addObserver: self
                                           selector: @selector(onUIDeviceOrientationDidChangeNotification:)
                                               name: UIDeviceOrientationDidChangeNotification
                                             object: nil ];
[[ UIDevice currentDevice ] beginGeneratingDeviceOrientationNotifications ];

इस पृष्ठ पर केवल एक ही उत्तर है कि मैं अपने नेविगेशन नियंत्रक कोड को सफलतापूर्वक अनुकूलित करने में सक्षम हूं। एक छोटी सी समस्या यह है कि घुमाया गया नेविगेशन बार पोर्ट्रेट और लैंडस्केप ओरिएंटेशन के बीच ऊंचाई को नहीं बदलता है क्योंकि यह सामान्य तंत्र के माध्यम से घुमाया जाएगा।
दान डायर

@DanDyer ने क्या आपने समस्या को नौसिखिए बार की गलत ऊंचाई से हल किया है? (विशेष रूप से ios6 में ऊंचाई गलत है)
एलेक्सविन

@AlexWien मैं अंततः ग्राहक को समझाने में कामयाब रहा कि हमें ऐसा नहीं करना चाहिए। IOS 6 के लिए आपको नई shouldAutorotateविधि के साथ कुछ करने की आवश्यकता हो सकती है (देखें stackoverflow.com/a/12586002/5171 )।
डैन डायर

@DanDyer ने इसे कल हल किया, एक सरल छिपाने और नेविगेशन और स्टेटस का शो देखें। ViewDidAppear में इसे हल किया गया। अब सभी काम करता है (SDK ios6, ios5 को टारगेट करें) मुझे लक्ष्य ios6 के साथ फिर से खेलना है
AlexWien

2

यह मेरे लिए काम करता है (धन्यवाद हेनरी कुक):

मेरे लिए उद्देश्य केवल लैंडस्केप ओरिएंटेशन परिवर्तनों से निपटना था।

init विधि:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(orientationChanged:)
                                             name:UIDeviceOrientationDidChangeNotification
                                           object:nil];

- (void)orientationChanged:(NSNotification *)notification {    
    //[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    CGRect bounds = [[ UIScreen mainScreen ] bounds ];
    CGAffineTransform t;
    CGFloat r = 0;
    switch ( orientation ) {
        case UIDeviceOrientationLandscapeRight:
            r = 0;
            NSLog(@"Right");
            break;
        case UIDeviceOrientationLandscapeLeft:
            r  = M_PI;
            NSLog(@"Left");
            break;
        default:return;
    }

    t = CGAffineTransformMakeRotation( r );

    UIApplication *application = [ UIApplication sharedApplication ];
    [ UIView beginAnimations:@"InterfaceOrientation" context: nil ];
    [ UIView setAnimationDuration: [ application statusBarOrientationAnimationDuration ] ];
    self.view.transform = t;
    self.view.bounds = bounds;
    [ UIView commitAnimations ];

    [ application setStatusBarOrientation: orientation animated: YES ];
}

1

मेरे पास एक ऐप है जहां मैं कुछ विचारों में डिवाइस रोटेशन का समर्थन करना चाहता हूं, लेकिन अन्य विशेष रूप से लैंडस्केप मोड में कोई मतलब नहीं है, इसलिए जैसे ही मैं विचारों को स्वैप कर रहा हूं मैं रोटेशन को पोर्ट्रेट के लिए सेट करने के लिए मजबूर करना चाहूंगा।

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

यह काफी सीधा था, लेकिन अन्य पोस्टों की तरह, मैं चाहता था कि ऐप स्वचालित रूप से वर्तमान डिवाइस ओरिएंटेशन की परवाह किए बिना पोर्ट्रेट पर लौट आए, जब पिछली स्क्रीन पर वापस आ जाए।

लैंडस्केप मोड में रहते हुए मैंने जो समाधान कार्यान्वित किया वह नेविगेशन बार को छिपाने के लिए था, जिसका अर्थ है कि उपयोगकर्ता केवल पोर्ट्रेट में पिछले स्क्रीन पर वापस आ सकता है। इसलिए, अन्य सभी स्क्रीन केवल पोर्ट्रेट में हो सकते हैं।

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)pInterfaceOrientation {
    BOOL lHideNavBar = self.interfaceOrientation == UIInterfaceOrientationPortrait ? NO : YES;
    [self.navigationController setNavigationBarHidden:lHideNavBar animated:YES];
}

इसमें मेरे ऐप के लिए अतिरिक्त लाभ भी है कि परिदृश्य मोड में अधिक स्क्रीन स्थान उपलब्ध है। यह उपयोगी है क्योंकि पीडीएफ फाइलों को प्रदर्शित करने के लिए प्रश्न में स्क्रीन का उपयोग किया जाता है।

उम्मीद है की यह मदद करेगा।


1

मैंने अंत में इसे काफी आसानी से हल किया। मैंने ऊपर दिए गए प्रत्येक सुझाव की कोशिश की और अभी भी कम आया, तो यह मेरा समाधान था:

ViewController में लैंडस्केप (बाएं या दाएं) रहने की जरूरत है, मैं अभिविन्यास परिवर्तन के लिए सुनो:

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

तो फिर में लिखें:

- (void) didRotate:(NSNotification *)notification
{   if (orientationa == UIDeviceOrientationPortrait) 
    {
        if (hasRotated == NO) 
        {
            NSLog(@"Rotating to portait");
            hasRotated = YES;
            [UIView beginAnimations: @"" context:nil];
            [UIView setAnimationDuration: 0];
            self.view.transform = CGAffineTransformIdentity;
            self.view.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(-90));
            self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
            self.view.frame = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
            [UIView commitAnimations];

    }
}
else if (UIDeviceOrientationIsLandscape( orientationa))
{
    if (hasRotated) 
    {
        NSLog(@"Rotating to lands");
        hasRotated = NO;
        [UIView beginAnimations: @"" context:nil];
        [UIView setAnimationDuration: 0];
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(0));
        self.view.bounds = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
        self.view.frame = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
        [UIView commitAnimations];

    }
}

किसी भी सुपर दृश्य / साक्षात्कार को ध्यान में रखें, जो कि ऑटोरेसेज़िंग का उपयोग करता है, क्योंकि view.bounds / फ्रेम को स्पष्ट रूप से रीसेट किया जा रहा है ...

परिदृश्य को बनाए रखने के लिए इस पद्धति के लिए एकमात्र चेतावनी, ओरिएंटेशन के बीच अंतर्निहित एनीमेशन स्विचिंग है जो घटित होती है, जब यह बेहतर होगा कि इसमें कोई बदलाव न हो।


1

iOS 6 समाधान:

[[[self window] rootViewController] presentViewController:[[UIViewController alloc] init] animated:NO completion:^{
    [[[self window] rootViewController] dismissViewControllerAnimated:NO completion:nil];
}];

सटीक कोड प्रति ऐप पर निर्भर करता है और यह भी कि आप इसे कहां रखते हैं (मैंने इसे अपने AppDelegate में उपयोग किया है)। [[self window] rootViewController]जो आप उपयोग करते हैं, उसके साथ बदलें । मैं एक का उपयोग कर रहा था UITabBarController


0

मुझे एक हल मिला और उसने फ्रेंच में कुछ लिखा (लेकिन कोड अंग्रेजी में हैं)। यहाँ

इसका तरीका यह है कि कंट्रोलर को विंडो व्यू में जोड़ा जाए (कंट्रोलर के पास रियोटेट का अच्छा कार्यान्वयन होना चाहिए .... फंक्शन)।


-3

यदि आप UIViewControllers का उपयोग कर रहे हैं, तो यह विधि है:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

NOजिन दृश्यों को आप घुमाना नहीं चाहते हैं, उन्हें देखने वाले नियंत्रकों के लिए वापस लौटें ।

अधिक जानकारी यहाँ


1
यह घूमना बंद कर देता है, मैं जो देख रहा हूं वह यह है कि यदि उपयोगकर्ता परिदृश्य में है, तो चित्र को एक रोटेशन वापस करने के लिए मजबूर करना है। मैंने ऊपर एक उदाहरण जोड़ा है कि मैं बेहतर क्या कह रहा हूं।
डेव वेरवर

-3

मुझे नहीं लगता कि यह रन-टाइम पर करना संभव है, हालांकि आप बेशक अपने यूआई में 90 डिग्री का परिवर्तन लागू कर सकते हैं।


यह उस कोड के साथ संभव है जिसे मैंने मूल रूप से पोस्ट किया था, आप बस कभी नहीं जानते कि कब काम करना बंद हो सकता है?)
डेव वर्वर

-3

यही है वह जो मेरे द्वारा उपयोग किया जाता है। (आपको कुछ संकलित चेतावनी मिलती है लेकिन यह सिम्युलेटर और आईफोन दोनों में काम करता है)

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

मैंने पाया है कि यह 4.1 में भी काम करने के लिए पर्याप्त है। हालाँकि मेरी स्थिति पट्टी छिपी हुई है क्योंकि मैं शीर्ष पर 20pixel गैप प्राप्त करता हूँ :(
एंथनी मेन

setOrientation निजी एपीआई है और इसका उपयोग करने वाला ऐप अस्वीकृत है।
अलोने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.