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




swift xcode6 (8)

अरे यार मेरे पास पूरा हल है बस कॉपी करो और इस कोड को लिखो स्विफ्ट 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 का नाम बदलें।

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

सीधे शब्दों में कहें, मेरे 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 में सम्मिलित करता हूं


आप पूर्वनिर्धारित प्रकार के संक्रमण का उपयोग कर सकते हैं

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

मुझे लगता है। ट्रान्सफ्लिपफ्रेमफ्लेफ्ट वांछित है

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

फिर कोड से इस दृश्य नियंत्रक को तुरंत हटा दें

let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let mainVC = storyboard.instantiateViewControllerWithIdentifier("someViewController") as! UIViewController

आप इसे या तो IBAction के अंदर या ViewDidLoad में उदाहरण के लिए कर सकते हैं, लेकिन शायद IBAction बेहतर विकल्प होगा। स्टोरीबोर्ड और व्यू कंट्रोलर दोनों के लिए सही पहचानकर्ता टाइप करने पर ध्यान दें। इसके अलावा, आपको अपने ऐपडेलगेट उदाहरण की घोषणा करनी होगी। यहाँ कार्यान्वित IBAction है

@IBAction func push(sender: UIButton) {

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let mainVC = storyboard.instantiateViewControllerWithIdentifier("secondVC") as! UIViewController
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

    UIView.transitionWithView(appDelegate.window!, duration: 0.5, options: .TransitionFlipFromLeft , animations: { () -> Void in
        appDelegate.window!.rootViewController = mainVC
        }, completion:nil)
}

यदि यह वह नहीं है जो आपने अपेक्षा की है, तो शायद आप एक कस्टम एनीमेशन बनाना चाहते हैं। यह लेख वास्तव में उपयोगी है: http://mathewsanders.com/animated-transitions-in-swift/


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

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

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

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


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

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

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

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)
    }
    )
}
}

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


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

स्विफ्ट 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)
    }
}

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


सही से बहस करें। आप नीचे की तरह 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)

स्विफ्ट 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)
    })
     }
}

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


स्विफ्ट 3 के लिए स्वीकृत उत्तर अपडेट (जून 2017 तक)

बाएं से दाएं से बहस करें

import UIKit

class SegueFromLeft: 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, y: 0) //Method call changed
        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) //Method call changed
        }
    }
}

दाएं से बाएं तक बहस करें

import UIKit

class SegueFromRight: 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*2, y: 0) //Double the X-Axis
        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)
        }
    }
}