กด segue ใน xcode โดยไม่มีภาพเคลื่อนไหว


90

ฉันกำลังใช้สตอรี่บอร์ดปกติและกดส่วนต่างๆใน xcode แต่ฉันต้องการให้มี segues ที่เพิ่งปรากฏในมุมมองถัดไปไม่ใช่เลื่อนมุมมองถัดไป (เช่นเดียวกับเมื่อคุณใช้แถบแท็บและมุมมองถัดไปจะปรากฏขึ้น)

มีวิธีง่ายๆที่ดีในการทำให้ปุ่มกดปกติเพียงแค่ "ปรากฏ" ไม่ใช่ "สไลด์" โดยไม่จำเป็นต้องเพิ่มการกำหนดค่าเอง

ทุกอย่างทำงานได้ดีโดยสมบูรณ์ฉันแค่ต้องการลบภาพเคลื่อนไหวสไลด์นั้นระหว่างมุมมอง


ฉันเพิ่งลองเปลี่ยน push segue เป็น modal segue เพราะจะทำให้ฉันลบแอนิเมชั่นได้ แต่ฉันมี tableview พร้อมแถบเครื่องมือด้านบนและการตั้งค่า segue เป็น modal จะลบแถบด้านบนนี้ออกและฉันหาวิธีใด ๆ ไม่เจอ เพื่อเพิ่มแถบด้านบนกลับเข้ามา! ดังนั้นฉันจึงต้องการโซลูชันที่ไม่ทำให้การเปลี่ยนแปลงเป็นภาพเคลื่อนไหว แต่ไม่ทำให้ tableview ของฉันเสียหาย
R2D2

คำตอบ:


143

ฉันสามารถทำได้โดยการสร้างการทำต่อที่กำหนดเอง (ตามลิงค์นี้ )

  1. สร้างคลาส Segue ใหม่ (ดูด้านล่าง)
  2. เปิด Storyboard ของคุณแล้วเลือกต่อ
  3. ตั้งค่าชั้นเรียนเป็นPushNoAnimationSegue(หรืออะไรก็ได้ที่คุณต้องการเรียกมัน)

ระบุคลาส segue ใน Xcode

สวิฟต์ 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

ขอบคุณสำหรับความคิดเห็นและข้อมูล
R2D2

11
คำตอบที่ดีที่สุด ความคิดใด ๆ เกี่ยวกับการทำให้แอนิเมชั่นกลับมาเหมือนกัน?
โธมัส

1
ใช้งานได้เหมือนมีเสน่ห์ นี่เป็นวิธีที่ "ถูกต้อง" ในการใช้สตอรีบอร์ด
Jeff Richley

1
มีใครหยุดภาพเคลื่อนไหวด้านหลังสำหรับคำตอบข้างต้น
Imran

4
ไม่ใช่วิธีการแก้ปัญหาการทำต่อแบบกำหนดเองจะนำเสนอเหนือเค้าโครงทั้งหมดเช่นเดียวกับการผลักแบบโมดอลในขณะที่การผลักดันต่อเนื่องแบบดั้งเดิมให้เกียรติ window.frame navigationController tabBarController ฯลฯ ... จะกำหนดค่าให้ segue ทำงานเหมือน push segue ได้อย่างไรแทนที่จะเป็น modal segue เหรอ? หรือ ... คำถาม $ 1.000.000 หนึ่งจะระบุภาพเคลื่อนไหวได้อย่างไร = NO เมื่อกำหนดค่าการทำต่อแบบปกติโดยใช้ STORYBOARDS
Pedro Borges

50

คุณสามารถยกเลิกการเลือก "Animates" ใน Interface Builder สำหรับ iOS 9 ได้

ป้อนคำอธิบายภาพที่นี่


3
นี่คือคำตอบของคำถามเดิม! คำตอบอื่น ๆ จะแสดงวิธีการบรรลุเป้าหมายนี้ใน objc / swift code ในขณะที่ dtochetto ใช้ Xcode เท่านั้น (เหมือนที่ร้องขอในคำถามเดิม)
drpawelo

อย่างไรก็ตามสำหรับการผ่อนคลายดูเหมือนจะไม่ได้ผล
Nicolas Manzini

2
นี่เป็นวิธีแก้ปัญหาที่ดีที่สุดและเร็วที่สุด แต่น่าเสียดายที่สิ่งนี้ใช้ไม่ได้กับ iOS 8
EricH206

2
@DanielT. บางทีคุณสามารถลาก 2 ฉากต่อกันบนสตอรีบอร์ดหนึ่งมีภาพเคลื่อนไหวและอีกชิ้นหนึ่งไม่มีภาพเคลื่อนไหว Identifierตั้งชื่อให้แตกต่างกัน
AechoLiu

1
โปรดทราบว่า XCode เพิ่งเพิ่มแอตทริบิวต์ให้กับองค์ประกอบต่อในไฟล์. สตอรี่บอร์ด คุณสามารถแก้ไขไฟล์. สตอรี่บอร์ดได้ด้วยตนเองและเพิ่ม animates = "NO" ให้กับส่วนต่างๆที่คุณสนใจหากคุณใช้ Visual Studio และเครื่องหมายถูกไม่มีในตัวออกแบบ
Wes

35

คำตอบของเอียนใช้ได้ผลดีมาก!

นี่คือ Segue เวอร์ชัน Swift หากใครต้องการ:

อัปเดตสำหรับ SWIFT 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
อาจเป็นเพราะเวอร์ชัน Swift ฉันต้องการ "เป็น!" แทนที่จะเป็น "เป็น" ในสองที่ที่คุณใช้
Carlos

1
หืมอาจจะอยู่ใน Swift 1.2? ฉันตรวจสอบด้วย Swift 2.0 ใน Xcode 7 Beta1 และรวบรวมโดยไม่มีคำเตือนใด ๆ
zavié

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];

หวังว่านี่จะช่วยคนอื่นได้!


คุณสามารถเพิ่มสิ่งนี้ลงในการทำงานของ UIButton หรืออะไรก็ได้ หากคุณต้องการข้ามไปยังตัวควบคุมมุมมองใหม่ที่ไม่มีภาพเคลื่อนไหวคุณสามารถใช้: - void (yourUIButtonAction) {CreditsViewController * creditpage = [self.storyboard instantiateViewControllerWithIdentifier: @ "Credits"]; [self.navigationController pushViewController: creditpage animated: NO]; }
R2D2

นี่ยังไม่ตอบคำถามด้วยซ้ำ คุณไม่ได้ใช้ segue ที่นี่!
KIDdAe

4

นี่คือเวอร์ชัน Swift ที่ปรับให้เข้ากับการนำเสนอ 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éไม่ได้เพิ่มอะไรเลย แต่ที่แย่กว่านั้นคือไม่มีการตรวจสอบตัวเลือกรวมอยู่ด้วย
Diego Freniche

ซึ่งแตกต่างจากคำตอบ @ zaviéเพราะมันแสดงให้เห็นถึงวิธีการmodallyนำเสนอโดยไม่ต้อง ViewController animation.Nice จะมีมันนี่เป็นข้อมูลอ้างอิงเพราะมันเกี่ยวข้องบ้างกับคำถาม
n

2

ตอบโดยใช้Swift3 -

สำหรับ "push" segue:

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

สำหรับ "modal" segue:

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

เพียงแค่ตั้งค่าanimated เท็จบนUINavigationController.pushViewControllerในสวิฟท์

self.navigationController!.pushViewController(viewController, animated: false)

1
ไม่แน่ใจว่าเหตุใดจึงถูกลดคะแนน ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน!
Eric

0

สำหรับฉันวิธีที่ง่ายที่สุดคือ:

UIView.performWithoutAnimation { 

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

    }

พร้อมใช้งานจาก iOS 7.0


หากใช้การทำเซ็กส์แบบปรับได้ฉันเชื่อว่าแม้ว่า performWithoutAnimation จะปิดการใช้งานแอนิเมชั่น แต่ก่อนที่จะดำเนินการต่อภาพเคลื่อนไหวจะเปิดใช้งานอีกครั้งหากการทำต่อมีการเลือก "ภาพเคลื่อนไหว" หลังจากดำเนินการแล้วอย่างไรก็ตามจะปิดใช้งานอีกครั้งหากก่อนหน้านี้เป็น
malhal

แต่คุณสามารถแก้ไขได้โดยสร้างคลาสย่อย UIStoryboardSegue และปิดการใช้งานภาพเคลื่อนไหวอีกครั้งก่อนดำเนินการ (เช่นใช้ตัวสร้างเพื่อตรวจสอบว่าถูกปิดใช้งานหรือไม่และจัดเก็บไว้ในคุณสมบัติ)
malhal

0

ฉันใช้ Visual Studio พร้อม Xamarin และผู้ออกแบบไม่ได้ระบุเครื่องหมายถูก "Animates" ในคำตอบของ dtochetto

โปรดทราบว่าตัวออกแบบ XCode จะใช้แอตทริบิวต์ต่อไปนี้กับองค์ประกอบทำต่อในไฟล์. สตอรี่บอร์ด: animates = "NO"

ฉันแก้ไขไฟล์. สตอรี่บอร์ดด้วยตนเองและเพิ่ม animates = "NO" ลงในองค์ประกอบทำต่อและมันก็ใช้ได้ผลสำหรับฉัน

ตัวอย่าง:

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

0

ผลักโดยไม่มีภาพเคลื่อนไหว: Swift นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน

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 ของคุณเป็น false จากที่ที่คุณต้องการเรียก performSegue เมื่อคุณต้องการพุชการทำต่อโดยไม่มีภาพเคลื่อนไหวและตั้งค่ากลับเป็นจริงหลังจากเรียก self.performSegue ขอให้โชคดี ....

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

ตั้งค่าคลาสทำต่อจากสตอรี่บอร์ดตามที่แสดงในภาพ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.