2011-01-16 16 views
8

में सही ढंग से काम नहीं करता है मेरा ऐप केवल परिदृश्य सही अभिविन्यास का समर्थन करता है।एनिमेटेड संक्रमण परिदृश्य अभिविन्यास

मैं एक दृश्य नियंत्रक के दृश्य में संक्रमण करने की कोशिश कर रहा हूं, लेकिन जब यह संक्रमण एनीमेशन (जैसे कर्ल अप) करता है, तो दृश्य 90 डिग्री घुमाया जाता है (इसलिए, सिम्युलेटर अभी भी परिदृश्य-सही अभिविन्यास में है, लेकिन दृश्य 90 डिग्री से घूर्णन दिखाई देता है)। जब संक्रमण खत्म होता है तो यह सही अभिविन्यास पर घूमता है। मेरा कोड नीचे है।

- (IBAction)buttonTouched 
{ 
    MyViewController *aViewController = [[MyViewController alloc] initWithNibName:NSStringFromClass([MyViewController class]) bundle:nil]; 

    [UIView transitionFromView:self.view 
         toView:aViewController.view 
         duration:2 
         options:UIViewAnimationOptionTransitionCurlUp 
        completion:NULL]; 
} 

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

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

उत्तर

16

खैर, मुख्य कारण यह है कि self.view (जो वर्तमान में "जानता है" कि आप परिदृश्य में हैं) को एक नए दृश्य के साथ प्रतिस्थापित किया जा रहा है जिसमें उस जानकारी नहीं है। तो एक विचार है कि स्वयं को AviewController.view को self.view के उप-दृश्य के रूप में रखना है (मान लें कि AViewController अपारदर्शी है)। आह, आप कहते हैं, लेकिन फिर मैं संक्रमण की अच्छी एनीमेशन खो देता हूँ FromView। खैर, यह सुंदरता का प्रयास करें:

[UIView transitionWithView:self.view 
        duration:2 
        options:UIViewAnimationOptionTransitionCurlUp 
       animations:^{ 
        [self.view addSubview:aViewController.view]; 
       } 
       completion:NULL]; 

किसी कारण है कि आप के लिए काम नहीं करता है के लिए, वैकल्पिक कि यह वास्तव में एक परिदृश्य दृश्य है aViewController.view "सिखाने" करने के लिए है, तो:

#define DEGREES_TO_RADIANS(__ANGLE__) ((__ANGLE__)/180.0 * M_PI) 
-(void)setNewViewToLandscape:(UIView*)viewObject { 
    //assumes self.view is landscape and viewObject is portrait 
    [viewObject setCenter:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)]; 
    CGAffineTransform cgCTM = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(90)); 
    viewObject.transform = cgCTM; 
    viewObject.bounds = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height); 
} 

MyViewController *aViewController = [[MyViewController alloc] initWithNibName:NSStringFromClass([MyViewController class]) bundle:nil]; 
[self setNewViewToLandscape:aViewController.view]; 

[UIView transitionFromView:self.view 
        toView:aViewController.view 
        duration:2 
        options:UIViewAnimationOptionTransitionCurlUp 
       completion:NULL]; 

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

+0

वाह ... अच्छा जवाब। धन्यवाद! – Ned

+0

वास्तव में महत्वपूर्ण जवाब, मेरे दिन बचाया! – BootMaker

+0

मेरा दिन भी बचाया, दूसरे विकल्प में एक छोटा टाइपो है हालांकि: [self setViewToLandscape: aViewController.view]; होना चाहिए: [self setNewViewToLandscape: aViewController.view]; अपने नामकरण सम्मेलन का उपयोग कर। इसके अलावा यदि आपका नया व्यू कंट्रोलर लैंडस्केप में है तो यहां चौड़ाई और ऊंचाई स्वैप करें: [viewObject setCenter: CGPointMake (self.view.frame.size.width/2, self.view.frame.size.height/2)]; (जो इसे ठीक से केंद्रित कर देगा। – Dado

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