8

मैं UISplitViewController का उपयोग कर रहा हूं, MasterViewController और DetailViewController के साथ, UINavigationController एस के बिना।UinavigationController के बिना Segue एनीमेशन क्षैतिज बनाने के लिए कैसे?

वर्तमान में के लिए master-> विस्तार segue एनीमेशन, द्वारा

performSegueWithIdentifier("showDetail", sender: self) 

शुरू हो रहा नीचे से ऊपर की तरफ से दिखाने DetailViewController में होते हैं।

मैं उस एनीमेशन को बाएं-वार्ड दिखा सकता हूं?

+0

क्या आप अपने स्टोरीबोर्ड का एक स्क्रीनशॉट और कोड स्निपेट जोड़ सकते हैं जिसे आप 'performSegueWithIdentifier ("showDetail", प्रेषक: स्वयं)' कॉल करने के लिए उपयोग कर रहे हैं? –

उत्तर

8

मैं हाल ही में किया है
1. transitioningDelegate और यह के प्रतिनिधि विधि

class MasterViewController: UITableViewController,UIViewControllerTransitioningDelegate { 

//prepare for segue 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showDetail" { 
     let detailVC = segue.destinationViewController as! DetailViewController 
     detailVC.transitioningDelegate = self 
//  detailVC.detailItem = object//Configure detailVC 
    } 
} 

//UIViewControllerTransitioningDelegate 
func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
    return LeftTransition() 
} 

func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
    let leftTransiton = LeftTransition() 
    leftTransiton.dismiss = true 
    return leftTransiton 
} 

}  

2 सेट:

यहाँ क्षैतिज एनीमेशन प्राप्त करने के लिए एक उदाहरण है सीगू कैसे किया जा रहा है, इस पर अधिक नियंत्रण रखने की आवश्यकता है, इसलिए मैंने अपनी कस्टम सीगू कक्षाएं बनाई हैं जो सभी अलग-अलग दिशाओं में संक्रमण करते हैं। यहां कार्यान्वयन में से एक है:

स्विफ्ट 2।एक्स

override func perform() { 

    //credits to http://www.appcoda.com/custom-segue-animations/ 

    let firstClassView = self.sourceViewController.view 
    let secondClassView = self.destinationViewController.view 

    let screenWidth = UIScreen.mainScreen().bounds.size.width 
    let screenHeight = UIScreen.mainScreen().bounds.size.height 

    secondClassView.frame = CGRectMake(screenWidth, 0, screenWidth, screenHeight) 

    if let window = UIApplication.sharedApplication().keyWindow { 

     window.insertSubview(secondClassView, aboveSubview: firstClassView) 

     UIView.animateWithDuration(0.4, animations: {() -> Void in 

      firstClassView.frame = CGRectOffset(firstClassView.frame, -screenWidth, 0) 
      secondClassView.frame = CGRectOffset(secondClassView.frame, -screenWidth, 0) 

      }) {(Finished) -> Void in 

       self.sourceViewController.navigationController?.pushViewController(self.destinationViewController, animated: false) 

     } 

    } 

} 

यह एक एक संक्रमण "दाएं से बाएं" होगा। आप स्रोत और गंतव्य दृश्य नियंत्रक की प्रारंभिक और समाप्ति स्थिति को बस बदलकर अपनी आवश्यकताओं के लिए इस फ़ंक्शन को संशोधित कर सकते हैं।

यह भी न भूलें कि आपको अपने सेग्यू को "कस्टम सेग्यू" के रूप में चिह्नित करने और इसे नई कक्षा को असाइन करने की आवश्यकता है।

अद्यतन: जोड़ा स्विफ्ट 3 संस्करण

स्विफ्ट 3

override func perform() { 

    //credits to http://www.appcoda.com/custom-segue-animations/ 

    let firstClassView = self.source.view 
    let secondClassView = self.destination.view 

    let screenWidth = UIScreen.main.bounds.size.width 
    let screenHeight = UIScreen.main.bounds.size.height 

    secondClassView?.frame = CGRect(x: screenWidth, y: 0, width: screenWidth, height: screenHeight) 

    if let window = UIApplication.shared.keyWindow { 

     window.insertSubview(secondClassView!, aboveSubview: firstClassView!) 

     UIView.animate(withDuration: 0.4, animations: {() -> Void in 

      firstClassView?.frame = (firstClassView?.frame.offsetBy(dx: -screenWidth, dy: 0))! 
      secondClassView?.frame = (secondClassView?.frame.offsetBy(dx: -screenWidth, dy: 0))! 

     }, completion: {(Finished) -> Void in 

      self.source.navigationController?.pushViewController(self.destination, animated: false) 

     }) 

    } 

} 
+0

से दिखाता है स्विफ्ट 3 में मेरे लिए काम करता है, बस कंपाइलर से बहुत से सुझाए गए सुधार करना पड़ता था। – MarksCode

+0

धन्यवाद। मैंने अब स्विफ्ट 3 संस्करण भी जोड़ा है। चियर्स – Armin

3

UINavigationControllers में अपने व्यू कंट्रोलर एम्बेड करें।

प्रति SplitViewController टेम्पलेट: enter image description here

छोटे डिवाइस पर यह मास्टर navigationController उपयोग करने के लिए जा रहा है।

इसके अलावा इस सवाल here और here और here

अधिक उत्तर दिया गया है View Controller Programming Guide से:

वहाँ एक दृश्य नियंत्रक परदे पर प्रदर्शित करने के लिए दो तरीके हैं: एक कंटेनर दृश्य नियंत्रक में एम्बेड या इसे पेश करो कंटेनर व्यू कंट्रोलर ऐप की प्राथमिक नेविगेशन प्रदान करता है ...।

स्टोरीबोर्ड में नेविगेशन नियंत्रक में कुछ एम्बेड करना मुश्किल नहीं है। उस दृश्य नियंत्रक पर क्लिक करें जिसे आप एम्बेड करना चाहते हैं, फिर संपादक-> एम्बेड करें-> नेविगेशन नियंत्रक।

+0

क्या UINavigationController के बिना यह संभव नहीं है? –

+0

अनिच्छा क्या है? यदि आप navBar नहीं चाहते हैं, तो बस self.navigationController.navBarHidden = DetailViewController के दृश्य में सही है DidLoad – beyowulf

+0

मैंने अभी मास्टरविच कंट्रोलर और DetailViewController के बीच एक UINavigationController डाला है, लेकिन यह अभी भी नीचे –

3

ऐसा लगता है जैसे नया दृश्य नियंत्रक सामान्य रूप से प्रस्तुत कर रहा है। यदि आप UINavigationController में विस्तार ViewController को एम्बेड करते हैं और नए नियंत्रक को दबाते हैं तो यह दाएं से बाएं से एनिमेट होगा और डिफ़ॉल्ट रूप से बैक बटन भी दिखाना चाहिए।

+1

मैंने अभी मास्टरविच कंट्रोलर और DetailViewController के बीच एक UINavigationController डाला है, लेकिन यह अभी भी नीचे –

1

आप एक कॉम्पैक्ट-चौड़ाई स्क्रीन है, "विस्तार शो" segue वापस मोडल segue automatically.So अपने DetailViewController डिफ़ॉल्ट मोडल segue के रूप में खड़ी दिखाई देगा गिर जाते हैं।

आप एक मॉड्यूल सेग्यू की एनीमेशन को अनुकूलित करने के लिए एक UIViewControllerTransitioningDelegate का उपयोग कर सकते हैं। एक कस्टम UIViewControllerAnimatedTransitioning: LeftTransition

import UIKit 

class LeftTransition: NSObject ,UIViewControllerAnimatedTransitioning { 
var dismiss = false 

func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval { 
    return 2.0 
} 

    func animateTransition(transitionContext: UIViewControllerContextTransitioning){ 
    // Get the two view controllers 
    let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)! 
    let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)! 
    let containerView = transitionContext.containerView()! 

    var originRect = containerView.bounds 
    originRect.origin = CGPointMake(CGRectGetWidth(originRect), 0) 

    containerView.addSubview(fromVC.view) 
    containerView.addSubview(toVC.view) 

    if dismiss{ 
     containerView.bringSubviewToFront(fromVC.view) 
     UIView.animateWithDuration(transitionDuration(transitionContext), animations: {() -> Void in 
       fromVC.view.frame = originRect 
      }, completion: { (_) -> Void in 
       fromVC.view.removeFromSuperview() 
       transitionContext.completeTransition(true) 
     }) 
    }else{ 
     toVC.view.frame = originRect 
     UIView.animateWithDuration(transitionDuration(transitionContext), 
      animations: {() -> Void in 
       toVC.view.center = containerView.center 
      }) { (_) -> Void in 
       fromVC.view.removeFromSuperview() 
       transitionContext.completeTransition(true) 
     } 
    } 
} 
} 
3

- स्विफ्ट 3.0 -

आर्मिन के समाधान के लिए तेजी से 3. न्यू अनुकूलित -> फ़ाइल -> कोको टच क्लास -> कक्षा: ... (उपclass: UIStoryboardSegue)।

import UIKit 

class SlideHorSegue: UIStoryboardSegue { 
    override func perform() { 

     //credits to http://www.appcoda.com/custom-segue-animations/ 

     let firstClassView = self.source.view 
     let secondClassView = self.destination.view 

     let screenWidth = UIScreen.main.bounds.size.width 
     let screenHeight = UIScreen.main.bounds.size.height 

     secondClassView?.frame = CGRect(x: screenWidth, y: 0, width: screenWidth, height: screenHeight) 

     if let window = UIApplication.shared.keyWindow { 

      window.insertSubview(secondClassView!, aboveSubview: firstClassView!) 

      UIView.animate(withDuration: 0.4, animations: {() -> Void in 

       firstClassView?.frame = (firstClassView?.frame)!.offsetBy(dx: -screenWidth, dy: 0) 
       secondClassView?.frame = (secondClassView?.frame)!.offsetBy(dx: -screenWidth, dy: 0) 

      }) {(Finished) -> Void in 

       self.source.navigationController?.pushViewController(self.destination, animated: false) 

      } 

     } 

    } 

} 

स्टोरीबोर्ड में: अपने सेग्यू को "कस्टम सेग्यू" के रूप में चिह्नित करें, और इसे नई कक्षा असाइन करें।

नोट: यदि आपके विवरण में यूआईएसक्रॉल व्यू है, तो यह काम नहीं करेगा।

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