2011-05-24 9 views
7

क्या किसी को पता है कि आईफोन के ऑटोरोटेशन को लॉक करने की संभावना है केवल एक दृश्य के लिए? मैं सेमी-ट्रांसकुलेंट व्यू के साथ कुछ प्रकार की मदद करना चाहता हूं, लेकिन मैं केवल लैंडस्केप ओरिएंटेशन का समर्थन करना चाहता हूं, यहां तक ​​कि अन्य सभी विचार घूम सकते हैं। इसलिए जब यह दृश्य शीर्ष पर है तो मैं रोटेशन लॉक करना चाहता हूं।ऑटोरोटेशन लॉक, प्रोग्रामेटिक

tnx

संपादित करें: अधिक विवरण: एक UIController 7 UIView है ... और मैं बस autorotation लॉक करने के लिए जब पिछले एक शीर्ष पर होता है कामना करते हैं।

उत्तर

4

उपयोग निम्नलिखित ...

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 
+4

आईओएस 6.0 में बहिष्कृत। समर्थित इंटरफेसऑरिएंटेशंस को ओवरराइड करें और इसके बजाय पसंदीदा इंटरफेसऑरिएंटेशन फॉर प्रेजेंटेशन विधियों को ओवरराइड करें।) – MOBYTELAB

0
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {      
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 
3

आप विंडो में अटैच कर सकते हैं। दृश्य लोड होने के बाद,

[self.view.window addSubview:yourStaticView]; 
[self.view.window bringSubviewToFront:yourStaticView]; // Do only if necessary 

इस दृश्य को छोड़ते समय इसे हटाएं। शायद viewWillDisappear: या viewDidDisappear: में।

0

मुझे बहुत सरल और कामकाजी समाधान मिला है। शीर्ष दृश्य जोड़कर मैंने एक बूल सेट किया जो तब घूर्णन को नियंत्रित करता है।

 

// Override to allow orientations other than the default portrait orientation. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Return YES for supported orientations; we support all. 

    if (helpViewOnTheTop) { 
     return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
    } 
    else 
    { 
     return YES; 
    } 
} 


2
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    //If you don't want to support multiple orientations uncomment the line below 
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait); 
    //return [super shouldAutorotateToInterfaceOrientation:toInterfaceOrientation]; 
} 
14

यह सवाल एक साल पहले कहा गया था, लेकिन अगर किसी को तो आप सर्वोच्च नियंत्रक पर supportedInterfaceOrientations उपयोग करने की आवश्यकता iOS 6 में ऐसा करने में रुचि रखता है स्वीकार किए जाते हैं विधि अब deprecated in iOS 6 है तो।

कल्पना कीजिए कि आप इस तरह एक सेटअप है ...

  • टैब बार नियंत्रक
    • नेविगेशन नियंत्रक
      • देखें नियंत्रक

... फिर आपको टैब बार नियंत्रक पर समर्थित इंटरफेसऑरिएंटेशन विधि सेट करने की आवश्यकता है।

टैब बार नियंत्रक (या कि अगर शीर्ष पर है नेविगेशन नियंत्रक) के एक उपवर्ग बनाएँ और उस में इन तरीकों सेट ...

- (BOOL)shouldAutorotate { 
    //Use this if your root controller is a navigation controller 
    return self.visibleViewController.shouldAutorotate; 
    //Use this if your root controller is a tab bar controller 
    return self.selectedViewController.shouldAutorotate; 
} 

- (NSUInteger)supportedInterfaceOrientations { 
    //Navigation Controller 
    return self.visibleViewController.supportedInterfaceOrientations; 
    //Tab Bar Controller 
    return self.selectedViewController.supportedInterfaceOrientations; 
} 

... तो आपके व्यक्तिगत दृश्य नियंत्रकों में आप कर सकते हैं गुण आप चाहते हैं ...

- (BOOL)shouldAutorotate { 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
    //return supported orientation masks 
    return UIInterfaceOrientationMaskLandscape; 
} 
+0

यहां सबसे अच्छा जवाब :) मैंने सभी दृश्य नियंत्रकों को बिना किसी प्रभाव के प्रस्तावित विधियों के साथ विभाजित कर दिया है जब तक कि मैंने शीर्ष स्तर नियंत्रक को समान तरीकों में जोड़ा नहीं है लेकिन संदर्भ के साथ (चयनित या दृश्यमान) नियंत्रक देखें। –

1

मुझे लगता है कई विशिष्ट जवाब है कि रुक-रुक कर काम कर रहे हैं निर्धारित करते हैं, लेकिन कोई भी ऐप्लिकेशन या अन्य के आराम करने के लिए के रूप में अंतर्दृष्टि प्रदान क्या असर या दुष्प्रभाव होते हैं संबंध में, नियंत्रक देखें, यदि उपयोगकर्ता फोन को बाहर झुकाव शुरू करता है व्यू कंट्रोलर जिसके लिए आप अभिविन्यास को नियंत्रित करना चाहते हैं ...

इसके साथ खेलने के बाद, आप महसूस कर सकते हैं (जैसे खुद) कि प्रतिकूल या अवांछित परिणाम हो सकते हैं (यानी। अभिविन्यास परिवर्तन तब होते हैं जब आप उन्हें नहीं चाहते हैं, या इसके विपरीत)।

अपने मुख्य प्राप्ति शामिल है कि केवल 'मूल दृश्य नियंत्रक' लागू करेगा 'shouldAutorotate', और नहीं बस किसी भी व्यक्ति को देखने के नियंत्रक आप के साथ ओवरराइड करने के लिए प्रयास करते हैं।

इस प्राप्ति के साथ एक विशिष्ट दृश्य नियंत्रक के लिए एक विशिष्ट अभिविन्यास 'लॉक' करना काफी मुश्किल लग रहा था।

(अर्थ है vc_A हमेशा चित्र और नहीं परिदृश्य को बदलने की अनुमति दी हो, जबकि होने vc_B हमेशा परिदृश्य हो सकता है और चित्र के लिए बदलने की अनुमति नहीं है) इस को स्वीकार करने के बाद

, निम्नलिखित कलन विधि क्या है केवल निर्दिष्ट दृश्य नियंत्रकों पर घूमने में सक्षम होने के लिए मेरे लिए काम किया।

स्थापना:

पहले आप (इन झुकाव केवल जिन्हें आप अपने कोड में उपयोग कर सकते हैं हो जाएगा)

या तो Info.plist या मुख्य परियोजना सेटिंग्स फ़ाइल में, झुकाव आप इच्छा की अनुमति देनी

enter image description here

कोड:

1) मेरी जड़ दृश्य नियंत्रक (यहाँ में: MasterViewC ऑनट्रॉलर) मैंने एक बूल प्रॉपर्टी (एक्टोरोटेट) को नामित किया है जिसका उपयोग तब किया जाना चाहिए जब 'चाहिएऑटोरोटेट' का आह्वान किया जाए।

2) रूट व्यू कंट्रोलर को सिंगलटन भी बनाते हैं ताकि किसी भी अन्य बच्चे दृश्य नियंत्रक से आसानी से पहुंचा जा सके (संदर्भों को पारित किए बिना)।

ध्यान दें: '- (bool) shouldAutorotate' और BOOL का उपयोग आप भी पर्यवेक्षक/अधिसूचना पैटर्न या प्रतिनिधिमंडल या कुछ अन्य पैटर्न का उपयोग कर सकते हैं, लेकिन मेरे लिए सिंगलटन पैटर्न के लिए सबसे आसान

3) प्रतिनिधि जोड़ने था इसकी वापसी के लिए ऑटोरोटेट

4) एक उदाहरण विधि 'setInterfaceOrientation' बनाएं। कुछ अन्य वर्ग और/या में अपने 'viewDidLoad' में इस विधि कॉल करेंगे अपने 'viewWillDisappear'

// 1) 
@implementation MasterViewController { 
    BOOL allowAutorotate; 
} 

// 2) 
+ (id)sharedMasterViewController { 
    static MasterViewController *sharedMasterViewController = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
    sharedMasterViewController = [[self alloc] init]; 
    }); 
    return sharedMasterViewController; 
} 
- (id)init 
{ 
    self = [super init]; 
    if (self) 
    { 
     allowAutorotate = NO; 
    } 

    return self; 
} 

// 3) 
- (BOOL)shouldAutorotate 
{ 
    return allowAutorotate; 
} 

// 4) 
- (void)setInterfaceOrientation:(NSInteger)orientation 
{ 
    allowAutorotate = YES; 

    NSNumber *value = [NSNumber numberWithInt:orientation]; 
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"]; 

    allowAutorotate = NO; 
} 

5) अंत में कुछ अन्य वर्ग में जड़ दृश्य नियंत्रक हो और 'setInterfaceOrientation' तदनुसार

// 5) 
#import "MasterViewController.h" 

@implementation SomeViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    [[MasterViewController sharedMasterViewController] setInterfaceOrientation:UIInterfaceOrientationLandscapeRight]; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [[MasterViewController sharedMasterViewController] setInterfaceOrientation:UIDeviceOrientationPortrait]; 
} 
आह्वान

नोट:

1) इस उदाहरण का परिणाम होना चाहिए कि एप्लिकेशन शुरू में चित्र में लोड होगा, तो आप 'SomeViewController' को लोड करते हैं, यह परिदृश्य के लिए बदल जाएगा, और फिर जब तुम remov ई, यह वापस चित्र में बदल जाएगा।

2) यह इस तरह काम करता है ...

हर बार जब आप शारीरिक रूप से फोन झुकाव, प्रतिनिधि 'shouldAutorotate' शुरू हो जाती है (केवल 'मूल दृश्य नियंत्रक' से),

रूप में अच्छी तरह हर बार जब आप प्रोग्राम के रूप में फोन झुकाव

NSNumber *value = [NSNumber numberWithInt:orientation]; 
[[UIDevice currentDevice] setValue:value forKey:@"orientation"]; 

प्रतिनिधि 'चाहिएऑटोरोटेट' का आह्वान किया जाता है।

इस

कारण है कि हम पहले 'allowAutorotate = हाँ,', तो, 'फोन झुकाव' तो 'allowAutorotate = नहीं;'

इसलिए, हमारे पास एक बार प्रोग्रामेटिक रूप से, जब हम चाहते हैं, केवल उन्मुखीकरण परिवर्तन को अनुमति देने/निष्पादित करने का नतीजा है।

glhf!

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