Đẩy segue trong xcode mà không có hoạt ảnh


90

Tôi đang sử dụng phân cảnh thông thường và đẩy các segues trong xcode, nhưng tôi muốn các segues chỉ xuất hiện ở chế độ xem tiếp theo, không trượt chế độ xem tiếp theo (như khi bạn sử dụng thanh tab và chế độ xem tiếp theo chỉ xuất hiện).

Có cách nào đơn giản hay để có các segues đẩy bình thường chỉ "xuất hiện" chứ không phải "trượt" mà không cần thêm các segues tùy chỉnh không?

Mọi thứ đang hoạt động hoàn toàn tốt, tôi chỉ muốn loại bỏ hoạt ảnh slide đó giữa các khung nhìn.


Tôi vừa cố gắng thay đổi push segue thành modal segue, vì điều đó có thể cho phép tôi xóa hoạt ảnh, nhưng tôi có chế độ xem bảng với thanh công cụ trên cùng và việc đặt segue thành modal sẽ xóa thanh trên cùng này và tôi không thể tìm thấy bất kỳ cách nào để thêm lại thanh trên cùng! Vì vậy, tôi cần một giải pháp không làm động quá trình chuyển đổi, nhưng không phá vỡ chế độ xem bảng của tôi.
Richard

Câu trả lời:


143

Tôi đã có thể làm điều này bằng cách tạo một segue tùy chỉnh (dựa trên liên kết này ).

  1. Tạo một lớp segue mới (xem bên dưới).
  2. Mở Storyboard của bạn và chọn segue.
  3. Đặt lớp thành PushNoAnimationSegue(hoặc bất cứ thứ gì bạn quyết định gọi nó).

Chỉ định lớp giả mạo trong Xcode

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

Mục tiêu C

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

Cảm ơn cho nhận xét và đầu vào.
Richard

11
Câu trả lời tốt nhất. Bất kỳ ý tưởng nào về việc đạt được điều tương tự cho hoạt ảnh phía sau?
Thomas

1
Hoạt động như một sự quyến rũ. Đây cũng là cách làm "đúng đắn" với các segues bảng phân cảnh.
Jeff Richley

1
Có ai đã dừng hoạt ảnh trở lại cho câu trả lời trên.
Imran

4
Không phải là giải pháp, segue tùy chỉnh trình bày trên toàn bộ bố cục giống như một phương thức push trong khi cửa sổ danh dự push segue ban đầu. Khung điều hướngController tabBarController, v.v. ? hoặc ... các $ 1.000.000 câu hỏi, làm thế nào để xác định hình ảnh động = NO khi cấu hình một segue thường xuyên sử dụng Storyboards
Pedro Borges

49

Bạn có thể bỏ chọn "Hoạt ảnh" trong Trình tạo giao diện cho iOS 9

nhập mô tả hình ảnh ở đây


3
Đây là câu trả lời cho câu hỏi ban đầu! Các câu trả lời khác cho thấy cách đạt được điều này trong mã objc / swift, trong khi dtochetto chỉ sử dụng Xcode (như được yêu cầu trong câu hỏi gốc).
drpawelo

Tuy nhiên cho segue Thư giãn nó không dường như làm việc
Nicolas Manzini

2
Đây là giải pháp tốt nhất và nhanh nhất, không may này không hoạt động trên iOS 8.
EricH206

2
@DanielT. Có thể, bạn có thể kéo 2 segue trên bảng phân cảnh, một có hoạt ảnh và một không có hoạt ảnh. Đặt Identifiertên khác cho chúng .
AechoLiu

1
Lưu ý rằng XCode chỉ thêm một thuộc tính vào phần tử segue trong tệp .storyboard. Bạn có thể chỉnh sửa thủ công tệp .storyboard và thêm animates = "NO" vào segues mà bạn quan tâm nếu bạn đang sử dụng visual studio và dấu kiểm không có sẵn trong trình thiết kế.
Wes

35

Câu trả lời của Ian hoạt động tuyệt vời!

Đây là phiên bản Swift của Segue, nếu ai cần:

CẬP NHẬT CHO SWIFT 5, THÁNG 5 NĂM 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
Có lẽ do phiên bản Swift, tôi cần "as!" thay vì "as" ở hai nơi bạn sử dụng chúng.
Carlos

1
Hm có thể trong Swift 1.2? Tôi đã kiểm tra với Swift 2.0 trong Xcode 7 Beta1 và nó được biên dịch mà không có bất kỳ cảnh báo nào.
zavié

6

Bây giờ tôi đã quản lý để làm điều này bằng cách sử dụng mã sau:

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

Hy vọng điều này sẽ giúp người khác!


Bạn chỉ có thể thêm nó vào hành động của UIButton hoặc bất cứ thứ gì. Nếu bạn muốn chuyển sang bộ điều khiển chế độ xem mới không có hoạt ảnh, bạn có thể sử dụng: - void (yourUIButtonAction) {CreditsViewController * creditspage = [self.storyboard InstantiateViewControllerWithIdentifier: @ "Credits"]; [self.navigationController pushViewController: creditspage animation: NO]; }
Richard

Điều này thậm chí không trả lời câu hỏi. Bạn không sử dụng segue ở đây!
KIDdAe

4

Đây là phiên bản Swift được điều chỉnh để trình bày một cách mô thức ViewController mà không có hoạt ảnh:

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
Mã này được sao chép từ câu trả lời @ zavié, không thêm bất cứ điều gì, nhưng thực sự tệ hơn: không kiểm tra các tùy chọn được bao gồm
Diego Freniche

Điều này khác với câu trả lời @ zavié vì nó cho thấy làm thế nào để modally trình bày một ViewController mà không animation.Nice để có nó ở đây như là tài liệu tham khảo vì nó phần nào liên quan đến câu hỏi.
n.Drake

2

trả lời bằng Swift3 -

cho segue "đẩy":

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

cho segue "modal":

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

1

Đối với bất kỳ ai sử dụng Xamarin iOS, lớp học giả tùy chỉnh của bạn cần phải trông như sau:

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

    }

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

Đừng quên rằng bạn vẫn cần đặt một segue tùy chỉnh trong bảng câu chuyện của mình và đặt lớp thành lớp PushNoAnimationSegue.


0

Đối với tôi, cách dễ nhất để làm như vậy là:

UIView.performWithoutAnimation { 

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

    }

Có sẵn từ iOS 7.0


Nếu sử dụng segues thích ứng, tôi tin rằng mặc dù performanceWithoutAnimation đặt các hoạt ảnh đã bị vô hiệu hóa, nhưng trước khi thực hiện phân biệt, các hoạt ảnh được bật lại nếu phân biệt đã chọn "hoạt ảnh". Sau khi thực hiện, nó sẽ vô hiệu hóa chúng một lần nữa nếu trước đó là.
malhal

Nhưng bạn có thể giải quyết vấn đề này bằng cách tạo một lớp con UIStoryboardSegue và vô hiệu hóa lại các hoạt ảnh trước khi thực hiện (ví dụ: sử dụng hàm tạo để kiểm tra xem chúng có bị vô hiệu hóa hay không và lưu trữ nó trong một thuộc tính).
malhal

0

Tôi đang sử dụng Visual Studio w / Xamarin và nhà thiết kế không cung cấp dấu kiểm "Hoạt ảnh" trong câu trả lời của dtochetto.

Lưu ý rằng trình thiết kế XCode sẽ áp dụng thuộc tính sau cho phần tử segue trong tệp .storyboard: animates = "NO"

Tôi đã chỉnh sửa thủ công tệp .storyboard và thêm animates = "NO" vào (các) phần tử segue và nó hoạt động với tôi.

Thí dụ:

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

0

PUSH KHÔNG CÓ ANIMATION: Swift Đây là những gì đã làm việc cho tôi.

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

Cách sử dụng : Đặt lớp segue từ bảng phân cảnh như trong hình. đặt isAnimationRequired từ bộ điều khiển xem của bạn thành false từ nơi bạn muốn gọi performanceSegue, khi bạn muốn đẩy segue mà không có hoạt ảnh và đặt lại thành true sau khi gọi self.performSegue. May mắn nhất....

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

thiết lập lớp segue từ bảng phân cảnh như trong hình.


-1

Chỉ cần thiết lập animated sai trên UINavigationController.pushViewControllertrong Swift

self.navigationController!.pushViewController(viewController, animated: false)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.