2014-04-29 8 views
8

के साथ रूट व्यू कंट्रोलर बदलना मैं रूट कंट्रोलर को एक बटन दबाकर बदल रहा हूं जो दृश्य नियंत्रक को कस्टम सेग्यू में लगाया गया है जिसे मैं बदलना चाहता हूं। कस्टम सेग्यू इस तरह दिखता है:आईओएस - एनीमेशन

- (void)perform{ 
    UIViewController *source = (UIViewController *)self.sourceViewController; 
    source.view.window.rootViewController = self.destinationViewController; 
} 

लेकिन यह तुरंत रूट व्यू कंट्रोलर को बदल देता है। मैं नियंत्रक को पुराने नियंत्रक के शीर्ष पर फीका करना चाहता हूं।

+0

संभव डुप्लिकेट http://stackoverflow.com/questions/10961926/how-do-i-do -ए-फीड-नो-ट्रांज़िशन-बीच-व्यू-कंट्रोलर) – BangOperator

+0

आपका कोड नेविगेशन बार छुपाता है – user2070775

उत्तर

3

मुझे लगता है कि कई जवाब पहले से ही इस के लिए देखते हैं, लेकिन कुछ इस तरह काम करना चाहिए:

[UIView transitionWithView:self.sourceViewController.view.window 
        duration:0.5 
        options:UIViewAnimationOptionTransitionCrossDissolve 
       animations:^{ 
        self.sourceViewController.view.window.rootViewController = self.destinationViewController; 
       } completion:^(BOOL finished) { 
        // Code to run after animation 
       }]; 
20

ऐसा करने के लिए आम तरीका है:

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"YourSBName" bundle:nil]; 
    UIViewController *vc = [sb instantiateInitialViewController];// Or any VC with Id 
    DictateITAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    appDelegate.window.rootViewController = vc; // PLEASE READ NOTE ABOUT THIS LINE 
    [UIView transitionWithView:appDelegate.window 
         duration:INTERVAL_DURATION 
         options:UIViewAnimationOptionTransitionCrossDissolve 
        animations:^{ appDelegate.window.rootViewController = vc; } 
        completion:nil]; 

अब कुछ नोट के बारे में:

appDelegate.window.rootViewController = vc; // PLEASE READ NOTE ABOUT THIS LINE 

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

-3

सबसे आसान तरीका है:

[sourceViewController presentViewController:destinationViewController animated:YES completion:nil];

अधिक इसके बारे में: https://developer.apple.com/library/ios/featuredarticles/viewcontrollerpgforiphoneos/ModalViewControllers/ModalViewControllers.html

+0

यह रूट व्यू कंट्रोलर को नहीं बदलता है, यह स्टैक पर एक नया व्यू कंट्रोलर जोड़ता है। आप इस विधि का उपयोग कई बार स्मृति मुक्त नहीं करेंगे। – LightMan

2

मैं अपने वर्तमान परियोजना के लिए स्विफ्ट 3.0 में यह अनुवाद करने के लिए की जरूरत है। यहाँ करने के लिए एक रास्ता है कि:

//Get the storyboard that contains the VC you want 
let storyboard = UIStoryboard(name: "Main", bundle: nil) 

//Get the VC you want to push onto the stack 
//You can use storyboard.instantiateViewController(withIdentifier: "yourStoryboardId") 
guard let vc = storyboard.instantiateInitialViewController() else { return } 

//Get the current app delegate 
guard let appDel = UIApplication.shared.delegate as? AppDelegate else { return } 

//Set the current root controller and add the animation with a 
//UIView transition 
appDel.window?.rootViewController = vc 

UIView.transition(with: appDel.window!, 
       duration: 0.25, 
       options: .transitionCrossDissolve, 
      animations: { appDel.window?.rootViewController = vc } , 
      completion: nil) 
[मैं एक फीका कर कैसे करते हैं/कोई दृश्य नियंत्रकों के बीच संक्रमण] (की
संबंधित मुद्दे