iOS सेगमेंट-बाएँ से दाएँ-




swift xcode6 (9)

स्विफ्ट 4 के स्वीकृत उत्तर को अपडेट करें:

class SegueFromLeft: UIStoryboardSegue
{ 
     override func perform(){

    let src = self.source
    let dst = self.destination

    src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)
    dst.view.transform = CGAffineTransform(translationX: -src.view.frame.size.width, y: 0)

    UIView.animate(withDuration: 0.25,
                               delay: 0.0,
                               options: UIViewAnimationOptions.curveEaseInOut,
                               animations: {
                                dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
    },
                               completion: { finished in
                                src.present(dst, animated: false, completion: nil)
    })
     }
}

इसे बेझिझक उत्तर में कॉपी करें और इस टिप्पणी को हटा दें। (यह एक सीधा अपडेट है, कुछ भी नया नहीं है।)

मैंने सेगमेंट पर अन्य पोस्ट पढ़ी हैं, लेकिन कोई भी मेरे सवाल को हल नहीं करता है।

सीधे शब्दों में कहें, मेरे ViewController आदेश दिए गए हैं, एक किताब की तरह। मैं पिछड़े संक्रमण चाहता हूँ (उदाहरण: पृष्ठ ९ से) तक) हमेशा बाएं से दाएं मौजूद (स्लाइड ओवर)। मैं आगे के बदलाव (पेज 9 से 10 तक) दाएं से बाएं पेश करना चाहता हूं।

हां, मेरा नव-नियंत्रक बैक बटन (ऊपरी बाएँ) इस तरह प्रस्तुत करता है यदि आप पृष्ठ द्वारा पृष्ठ के माध्यम से पेजिंग कर रहे हैं। हालाँकि, यदि आप किसी इंडेक्स से कूदते हैं तो नेवी कंट्रोलर का बैक फंक्शन आपको इंडेक्स में वापस ले जाता है।

मेरा उद्देश्य यह है कि यदि कोई उपयोगकर्ता किसी इंडेक्स से पेज 9 (उदाहरण के लिए) कूदता है, तो राइट स्वाइप करता है, यह पेज को राइट से फ्लिक करेगा और पेज 8 को दिखाएगा। एक बार पेज 8 पर, अगर वे फ्लिक करते हैं तो पेज बचेगा बाईं ओर से भाग जाओ और वे फिर से पेज 9 पर आएंगे।

मेरे सभी ViewController , डिफ़ॉल्ट रूप से, दाईं ओर से बाईं ओर स्लाइड करके प्रस्तुत करते हैं।

उदाहरण: इसे एक किताब की तरह सोचें, अगर मैं सूचकांक का उपयोग अध्याय 4 में करने के लिए करता हूं, तो दाएं स्वाइप करें और स्टैक से एक दृश्य पॉप करें, मैं इंडेक्स पर वापस आऊंगा। लेकिन यदि आप अध्याय 4, पृष्ठ 394 पर हैं और आप सही स्वाइप करते हैं, तो आप इंडेक्स पर वापस नहीं जाना चाहते हैं! आप अध्याय ३, पृष्ठ ३ ९ ३ के अंतिम पृष्ठ पर जाना चाहते हैं! तो नौसेना ढेर मेरे लिए कोई मदद नहीं है।

अंत उदाहरण

विवरण: 1. मैं ViewControllers के बीच स्विच करने के लिए बटन-टैप पर नए Xcode "शो" का उपयोग कर रहा हूं।

  1. मैं एक नेविगेशन नियंत्रक का उपयोग कर रहा हूं, शीर्ष-बाएं "बैक" बटन की कार्यक्षमता के लिए। यह नेवी स्टैक का उपयोग करता है और ठीक काम करता है।

  2. हालाँकि, नीचे (बैक बटन, होम बटन, इंडेक्स बटन, फ़ॉरवर्ड बटन) और इशारों पर मेरा अपना कस्टम नेव-बार है। ये वही हैं, जिनके साथ मुझे पुस्तक जैसी कार्यक्षमता चाहिए।

  3. स्विफ्ट में कोडिंग।

  4. Xcode 6.3 के साथ काम करना

मैंने पढ़ा है कि वहाँ एनीमेशन कोड है। मैंने पढ़ा है कि गहराई से प्रोग्रामेटिक ट्रांज़िशन हैं जिनका उपयोग किया जा सकता है। यह सिर्फ पागल लगता है कि मेरे पास बाईं ओर से प्रस्तुत करने और आसानी से एनीमेशन को रिवर्स करने के लिए मेरे द्वारा प्रस्तुत किए जाने वाले सेगमेंट का चयन करने का कोई सरल तरीका नहीं है।

धन्यवाद!

प्रयास लॉग:

I tried DCDC's code:
    UIView.transitionWithView(self.window!, duration: 0.5, options:.TransitionFlipFromLeft, animations: { () -> Void in
            self.window!.rootViewController = mainVC
            }, completion:nil)

यह त्रुटि तब होती है जब मैं अपने बैक-स्वाइप के लिए DBAC के कोड को IBAction में सम्मिलित करता हूं


यहाँ एक कस्टम-सेग क्लास है जिसका उपयोग आप स्विफ्ट में बाएं से दाएं सेग करने के लिए कर सकते हैं। इसके लिए क्वार्ट्जकोर फ्रेमवर्क और न्यूनतम एनीमेशन की आवश्यकता है।

स्विफ्ट 2.2

import UIKit
import QuartzCore

class SegueFromLeft: UIStoryboardSegue {

    override func perform() {
        let src: UIViewController = self.sourceViewController
        let dst: UIViewController = self.destinationViewController
        let transition: CATransition = CATransition()
        let timeFunc : CAMediaTimingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
        transition.duration = 0.25
        transition.timingFunction = timeFunc
        transition.type = kCATransitionPush
        transition.subtype = kCATransitionFromLeft
        src.navigationController!.view.layer.addAnimation(transition, forKey: kCATransition)
        src.navigationController!.pushViewController(dst, animated: false)
    }

}

स्विफ्ट 3.0

import UIKit
import QuartzCore

class SegueFromLeft: UIStoryboardSegue {

    override func perform() {
        let src: UIViewController = self.source
        let dst: UIViewController = self.destination
        let transition: CATransition = CATransition()
        let timeFunc : CAMediaTimingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
        transition.duration = 0.25
        transition.timingFunction = timeFunc
        transition.type = kCATransitionPush
        transition.subtype = kCATransitionFromLeft
        src.navigationController!.view.layer.add(transition, forKey: kCATransition)
        src.navigationController!.pushViewController(dst, animated: false)
    }
}

"बैक" बटन अभी भी संक्रमित दृश्य नियंत्रक पर नेविगेशन बार में दिखाई देगा, लेकिन आप इस दृश्य नियंत्रक के लिए नेविगेशन नियंत्रक को आसानी से अक्षम / कॉन्फ़िगर कर सकते हैं।


ऐसा लगता है कि आप सिर्फ UINavigationController के स्टैक से व्यू कंट्रोलर को पॉप करने की कोशिश कर रहे हैं, जैसे कि डिफ़ॉल्ट बैक बटन होगा।

आप एक दो काम कर सकते हैं। सबसे आसान है कि आप अपने कस्टम बैक बटन को IBAction से कनेक्ट करें जो popViewControllerAnimated () कहता है:

@IBAction func tappedCustomBackButton(sender: AnyObject) {
    self.navigationController?.popViewControllerAnimated(true)
}

या आप अपने दूसरे व्यू कंट्रोलर से अपने पहले तक के लिए एक आराम से बहस बना सकते हैं।


सही से बहस करें। आप नीचे की तरह segue में प्रदर्शन फ़ंक्शन को ओवरराइड कर सकते हैं। इस फ़ंक्शन को एक कस्टम सेग क्लास के अंदर रखें और इस क्लास को सीग्यू को असाइन करें। यह नेविगेशन नियंत्रक के साथ और नेविगेशन नियंत्रक के बिना दोनों नियंत्रकों के लिए काम करेगा

override func perform()
{
    let src = self.sourceViewController
    print(src)
    let dst = self.destinationViewController
    print(dst)

    src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)
    dst.view.transform = CGAffineTransformMakeTranslation(src.view.frame.size.height, 0)

    UIView.animateWithDuration(0.35,
                               delay: 0.0,
                               options: UIViewAnimationOptions.CurveEaseInOut,
                               animations: {
                                dst.view.transform = CGAffineTransformMakeTranslation(0, 0)
        },
                               completion: { finished in
                                if let navController = src.navigationController {
                                    navController.pushViewController(dst, animated: false)

                                } else {
                                    src.presentViewController(dst, animated: false, completion: nil)
                                }            }
    )
}

यदि आप बाएं से तर्क चाहते हैं तो इसका उपयोग करें

CGAffineTransformMakeTranslation(-src.view.frame.size.height, 0)

मेरे मामले में मैं एक साइडबार मेनू बनाता था ...

मैंने एक नया व्यू कंट्रोलर और दो रीति-रिवाजों का निर्माण किया

मेनू को खोलने के लिए:

import Foundation
import UIKit

class SegueFromLeft: UIStoryboardSegue {

  override func perform() {

    let src = self.source as UIViewController
    let dst = self.destination as UIViewController

    src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)
    dst.view.transform = CGAffineTransform(translationX: -src.view.frame.size.width, y: 0)

    UIView.animate(withDuration: 0.25,
                               delay: 0.0,
                               options: UIViewAnimationOptions.curveEaseInOut,
                               animations: {
                                dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
    },
                               completion: { finished in
                                src.present(dst, animated: false, completion: nil)
    }
    )

}

}

मेनू को बंद करने के लिए:

import Foundation
import UIKit

class SegueFromRight: UIStoryboardSegue {

override func perform() {

    let src = self.source as UIViewController
    let dst = self.destination as UIViewController

    src.view.superview?.insertSubview(dst.view, belowSubview: src.view)
    src.view.transform = CGAffineTransform(translationX: 0, y: 0)

    UIView.animate(withDuration: 0.25,
                               delay: 0.0,
                               options: UIViewAnimationOptions.curveEaseInOut,
                               animations: {
                                src.view.transform = CGAffineTransform(translationX: -src.view.frame.size.width, y: 0)
    },
                               completion: { finished in
                                src.dismiss(animated: false, completion: nil)
    }
    )
}
}

मुझे आशा है कि यह आपकी मदद करेगा ...


यह है कि मैं एक नव-नियंत्रक की आवश्यकता के बिना प्रभाव कैसे प्राप्त करता हूं। इसके बजाय यह प्रयास करें:

स्विफ्ट 4:

import UIKit
class SegueFromLeft: UIStoryboardSegue {
    override func perform() {
        let src = self.source
        let dst = self.destination

        src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)
        dst.view.transform = CGAffineTransform(translationX: -src.view.frame.size.width, y: 0)

        UIView.animate(withDuration: 0.25,
                              delay: 0.0,
                            options: .curveEaseInOut,
                         animations: {
                                dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
                                },
                        completion: { finished in
                                src.present(dst, animated: false, completion: nil)
                                    }
                        )
    }
}

स्विफ्ट 3:

import UIKit

class SegueFromLeft: UIStoryboardSegue
{
    override func perform()
    {
        let src = self.sourceViewController
        let dst = self.destinationViewController

        src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)
        dst.view.transform = CGAffineTransformMakeTranslation(-src.view.frame.size.width, 0)

        UIView.animateWithDuration(0.25,
            delay: 0.0,
            options: UIViewAnimationOptions.CurveEaseInOut,
            animations: {
                dst.view.transform = CGAffineTransformMakeTranslation(0, 0)
            },
            completion: { finished in
                src.presentViewController(dst, animated: false, completion: nil)
            }
        )
    }
}

फिर स्टोरीबोर्ड में, उस सेगमेंट पर क्लिक करें जिसे आप बदलना चाहते हैं। विशेषताओं में निरीक्षक प्रकार को 'कस्टम' में बदलते हैं और वर्ग को 'SegueFromLeft' में बदलते हैं।


स्विफ्ट 3 में अपडेट किया गया स्वीकृत उत्तर:

import UIKit

class SegueFromLeft: UIStoryboardSegue
{
    override func perform()
    {
        let src = self.source
        let dst = self.destination

        src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)
        dst.view.transform = CGAffineTransform(translationX: -src.view.frame.size.width, y: 0)

        UIView.animate(withDuration: 0.25,
            delay: 0.0,
            options: UIViewAnimationOptions.curveEaseInOut,
            animations: {
                dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
            },
            completion: { finished in
                src.present(dst, animated: false, completion: nil)
            }
        )
    }
}

एनीमेशन की तरह "बैक बटन" बनाने के लिए, इसका उपयोग करें।

class SegueRightToLeft: UIStoryboardSegue {

override func perform() {
    let src = self.source       //new enum
    let dst = self.destination  //new enum

    src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)
    dst.view.transform = CGAffineTransform(translationX: -src.view.frame.size.width/2, y: 0) 
    //slice the x axis translation in half

    UIView.animate(withDuration: 0.25, delay: 0.0, options: UIViewAnimationOptions.curveEaseInOut, animations: {
        dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
    }) { (finished) in
        src.present(dst, animated: false, completion: nil)
    }
}

अरे यार मेरे पास पूरा हल है बस कॉपी करो और इस कोड को लिखो स्विफ्ट 3।

func menu(){
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewController(withIdentifier: "MyAccountViewController") as! MyAccountViewController

    let transition: CATransition = CATransition()
    let timeFunc : CAMediaTimingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    transition.duration = 0.5
    transition.timingFunction = timeFunc
    transition.type = kCATransitionPush
    transition.subtype = kCATransitionFromLeft
    self.navigationController?.view.layer.add(transition, forKey: kCATransition)
    self.navigationController?.pushViewController(vc, animated: false)
}

नोट: "MyAccountViewController" पाठ के साथ अपने ViewController का नाम बदलें।