कोई एनीमेशन के साथ xcode में पुश बहस


90

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

वहाँ एक अच्छा सरल तरीका है कि सामान्य "" दिखाई देते हैं और कस्टम स्लाइड जोड़ने की आवश्यकता के बिना "स्लाइड" नहीं है?

सब कुछ पूरी तरह से ठीक काम कर रहा है, मैं सिर्फ विचारों के बीच उस स्लाइड एनीमेशन को निकालना चाहता हूं।


मैंने अभी-अभी पुश सेगर को एक मोडल सेगमेंट में बदलने की कोशिश की है, क्योंकि इससे मुझे एनीमेशन को हटाने की सुविधा मिल सकती है, लेकिन मेरे पास एक टॉप टूलबार के साथ एक टेबलव्यू है, और सेगल को मोडल में सेट करने से यह टॉप बार हट जाता है, और मुझे कोई रास्ता नहीं सूझता शीर्ष बार को वापस जोड़ने के लिए! इसलिए मुझे एक समाधान की आवश्यकता है जो संक्रमण को चेतन नहीं करता है, लेकिन मेरी तालिका को नहीं तोड़ता है।
रिचर्ड

जवाबों:


143

मैं कस्टम सेगमेंट ( इस लिंक के आधार पर ) बनाकर ऐसा करने में सक्षम था ।

  1. एक नया सेगमेंट क्लास बनाएं (नीचे देखें)।
  2. अपना स्टोरीबोर्ड खोलें और सेगमेंट का चयन करें।
  3. कक्षा को उस पर सेट करें PushNoAnimationSegue(या जो भी आपने इसे कॉल करने का निर्णय लिया है)।

Xcode में segue class निर्दिष्ट करें

स्विफ्ट 4

import UIKit

/*
 Move to the next screen without an animation.
 */
class PushNoAnimationSegue: UIStoryboardSegue {

    override func perform() {
        self.source.navigationController?.pushViewController(self.destination, animated: false)
    }
}

उद्देश्य सी

PushNoAnimationSegue.h

#import <UIKit/UIKit.h>

/*
 Move to the next screen without an animation.
 */
@interface PushNoAnimationSegue : UIStoryboardSegue

@end

PushNoAnimationSegue.m

#import "PushNoAnimationSegue.h"

@implementation PushNoAnimationSegue

- (void)perform {

    [self.sourceViewController.navigationController pushViewController:self.destinationViewController animated:NO];
}

@end

टिप्पणी और इनपुट के लिए धन्यवाद।
रिचर्ड

11
सबसे बढ़िया उत्तर। वापस एनीमेशन के लिए एक ही प्राप्त करने पर कोई विचार?
थॉमस

1
एक जादू की तरह काम करता है। यह स्टोरीबोर्ड सेगेट्स के साथ करने का "सही" तरीका भी है।
जेफ रिक्ले

1
क्या किसी ने उपरोक्त उत्तर के लिए बैक एनीमेशन को रोका है।
इमरान

4
समाधान नहीं, कस्टम सेगमेंट पूरे लेआउट पर एक मोडल पुश की तरह प्रस्तुत करता है, जबकि मूल पुश सेगॉर विंडो का उपयोग करता है। ? या ... $ 1.000.000 प्रश्न, कैसे एक निर्दिष्ट एनिमेशन = कोई निर्दिष्ट नहीं करता है जब STORYBOARDS
पेड्रो बोर्गेस

49

आप iOS 9 के लिए इंटरफ़ेस बिल्डर में "एनिमेटेड" को अनचेक कर सकते हैं

यहां छवि विवरण दर्ज करें


3
यह मूल प्रश्न का उत्तर है! अन्य उत्तर बताते हैं कि इसे objc / स्विफ्ट कोड में कैसे प्राप्त किया जा सकता है, जबकि dtochetto केवल Xcode (जैसे मूल प्रश्न में अनुरोधित) का उपयोग करता है।
drpawelo

हालाँकि, आराम के लिए यह काम नहीं करता है
निकोलस मंज़िनी

2
यह सबसे अच्छा और तेज समाधान है, दुर्भाग्य से यह iOS 8 पर काम नहीं करता है
EricH206

2
@DanielT। हो सकता है, आप स्टोरीबोर्ड पर 2 सीग्यू खींच सकते हैं, एक में एनीमेशन है, और दूसरे में कोई एनीमेशन नहीं है। उन्हें अलग Identifierनाम दें ।
अचोइलियू

1
ध्यान दें कि XCode सिर्फ .storyboard फ़ाइल में segue तत्व के लिए एक विशेषता जोड़ता है। आप मैन्युअल रूप से .storyboard फ़ाइल को संपादित कर सकते हैं और सेगेट्स में "=" नहीं जोड़ सकते हैं, जिसकी आपको परवाह है अगर आप दृश्य स्टूडियो का उपयोग कर रहे हैं और चेकमार्क डिजाइनर में उपलब्ध नहीं है।
वेस

35

इयान का जवाब बहुत अच्छा काम करता है!

यदि किसी को आवश्यकता हो तो यहां सेग का एक स्विफ्ट संस्करण देखें:

स्विफ्ट 5, मई 2020 के लिए अद्यतन

PushNoAnimationSegue.swift

import UIKit

/// Move to the next screen without an animation
class PushNoAnimationSegue: UIStoryboardSegue {
override func perform() {
    if let navigation = source.navigationController {
        navigation.pushViewController(destination as UIViewController, animated: false)
    }
}

2
शायद स्विफ्ट संस्करण के कारण, मुझे "जैसे!" दो स्थानों पर "के रूप में" के बजाय आप उनका उपयोग करते हैं।
कार्लोस

1
हो सकता है कि स्विफ्ट 1.2 में हो? मैंने Xcode 7 Beta1 में स्विफ्ट 2.0 के साथ जाँच की और इसे बिना किसी चेतावनी के संकलित किया।
ज़विए

6

अब मैं निम्नलिखित कोड का उपयोग करके ऐसा करने में कामयाब रहा:

CreditsViewController *creditspage = [self.storyboard instantiateViewControllerWithIdentifier:@"Credits"];
[UIView beginAnimations:@"flipping view" context:nil];
[UIView setAnimationDuration:0.75];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.navigationController.view cache:YES];
[self.navigationController pushViewController:creditspage animated:NO];
[UIView commitAnimations];

मनाइए कि यह किसी और के लिए सहायक हो!


आप इसे केवल यूआईबूटन की क्रिया या जो भी हो, से जोड़ सकते हैं। यदि आप बिना किसी एनीमेशन के एक नए व्यू कंट्रोलर पर कूदना चाहते हैं, तो आप उपयोग कर सकते हैं: - void (yourUIButtonAction) {CreditsViewController * creditpage = [self.storyboard InstantiateViewControllerWithIfententifier: @ "क्रेडिट"]; [self.navigationController pushViewController: क्रेडिटपेज एनिमेटेड: NO]; }
रिचर्ड

यह भी सवाल का जवाब नहीं दे रहा है। आप यहाँ सेग का उपयोग नहीं कर रहे हैं!
KIDdAe

4

यहाँ स्विफ्ट संस्करण को सामान्य रूप से एनीमेशन के बिना ViewController प्रस्तुत करने के लिए अनुकूलित किया गया है :

import UIKit

/// Present the next screen without an animation.
class ModalNoAnimationSegue: UIStoryboardSegue {

    override func perform() {
        self.sourceViewController.presentViewController(
            self.destinationViewController as! UIViewController,
            animated: false,
            completion: nil)
    }

}

1
यह कोड @ zavié उत्तर से कॉपी किया गया है, कुछ भी नहीं जोड़ने के लिए, लेकिन वास्तव में बदतर है: वैकल्पिक के लिए कोई जांच शामिल नहीं है
डिएगो Freniche

क्योंकि यह दिखाता है कि कैसे करने के लिए यह @ zavié के जवाब से अलग है रीति से animation.Nice के बिना एक ViewController पेश इसे यहाँ संदर्भ के रूप में है, क्योंकि यह कुछ हद तक प्रश्न से संबंधित है।
n। ड्रेक जूल

2

Swift3 का उपयोग कर जवाब -

"पुश" सेग के लिए:

class PushNoAnimationSegue: UIStoryboardSegue
{
    override func perform()
    {
       source.navigationController?.pushViewController(destination, animated: false)
    }
}

"मोडल" सेगमेंट के लिए:

class ModalNoAnimationSegue: UIStoryboardSegue
{
    override func perform() {
        self.source.present(destination, animated: false, completion: nil)
    }
}

1

Xamarin iOS का उपयोग करने वाले किसी व्यक्ति के लिए आपके कस्टम सेग वर्ग को इस तरह दिखना चाहिए:

[Register ("PushNoAnimationSegue")]
public class PushNoAnimationSegue : UIStoryboardSegue
{
    public PushNoAnimationSegue(IntPtr handle) : base (handle)
    {

    }

    public override void Perform ()
    {
        SourceViewController.NavigationController.PushViewController (DestinationViewController, false);
    }
}

मत भूलो कि आपको अभी भी अपनी कहानी बोर्ड में एक कस्टम सेगमेंट सेट करने की आवश्यकता है और कक्षा को PushNoAnimationSegue वर्ग में सेट करें।


0

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

UIView.performWithoutAnimation { 

        self.performSegueWithIdentifier("yourSegueIdentifier", sender: nil)

    }

IOS 7.0 से उपलब्ध है


यदि अनुकूली सेगमेंट का उपयोग करते हुए मुझे विश्वास है कि यद्यपि performWithoutAnimation एनिमेशन को अक्षम करता है, तो इससे पहले कि segue का उपयोग किया जाता है एनिमेशन को फिर से सक्षम किया जाता है यदि segue में "एनिमेट" चेक किया गया हो। प्रदर्शन करने के बाद, हालांकि यह पहले से फिर से उन्हें अक्षम कर देता है।
मल्हल

लेकिन आप इसके आसपास एक UIStoryboardSegue को उपवर्ग बनाकर और प्रदर्शन से पहले एनिमेशन को अक्षम करके काम कर सकते हैं (उदाहरण के लिए निर्माणकर्ता का उपयोग करके यह जांचने के लिए कि क्या वे अक्षम हैं और किसी संपत्ति में इसे संग्रहीत कर रहे हैं)।
मल्हल

0

मैं विज़ुअल स्टूडियो w / Xamarin का उपयोग कर रहा हूं, और डिज़ाइनर dtochetto के उत्तर में "एनिमेटेड" चेकमार्क प्रदान नहीं करता है।

ध्यान दें कि XCode डिज़ाइनर निम्नलिखित तत्व को .storyboard फ़ाइल में सेगमेंट तत्व पर लागू करेगा: एनिमेशन = = सं। "

मैंने मैन्युअल रूप से .storyboard फ़ाइल को एडिट किया और सेगमेंट तत्व (ओं) को एनिमेशन = "NO" जोड़ा, और यह मेरे लिए काम किया।

उदाहरण:

 <segue id="1234" destination="ZB0-vP-ctU" kind="modal" modalTransitionStyle="crossDissolve" animates="NO" identifier="screen1ToScreen2"/>

0

PUSH ANOUTATION के बिना: स्विफ्ट यहां मेरे लिए काम की है।

import ObjectiveC

private var AssociatedObjectHandle: UInt8 = 0
    extension UIViewController {

        var isAnimationRequired:Bool {
            get {
        return (objc_getAssociatedObject(self, &AssociatedObjectHandle) as? Bool) ?? true
            }
            set {
                objc_setAssociatedObject(self, &AssociatedObjectHandle, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            }
        }
    }

    -------------------- SilencePushSegue --------------------

class SilencePushSegue: UIStoryboardSegue {

    override func perform() {
        if self.source.isAnimationRequired == false {
            self.source.navigationController?.pushViewController(self.destination, animated: false)
        }else{
            self.source.navigationController?.pushViewController(self.destination, animated: true)
        }
    }
}

उपयोग : चित्र में दिखाए अनुसार स्टोरीबोर्ड से सेग क्लास सेट करें। isAnimationRequired को अपने viewcontroller से उस स्थान पर सेट करें जहाँ से आप PerformSegue कॉल करना चाहते हैं, जब आप बिना एनीमेशन के segue को पुश करना चाहते हैं और self.performSegue कॉल करने के बाद वापस सत्य पर सेट होते हैं। शुभकामनाएँ....

DispatchQueue.main.async {
                self.isAnimationRequired = false
                self.performSegue(withIdentifier: "showAllOrders", sender: self);
                self.isAnimationRequired = true
            }

स्टोरीबोर्ड से सेग क्लास सेट करें जैसा कि चित्र में दिखाया गया है।


-1

बस सेट animated झूठी पर UINavigationController.pushViewControllerस्विफ्ट में

self.navigationController!.pushViewController(viewController, animated: false)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.