Подтвердить что ты не робот

IOS Segue - Слева направо -

Я читал другие сообщения по segues, но никто не решает мой вопрос.

Проще говоря, мой ViewController упорядочен, как книга. Я хочу вернуться назад (пример: со страницы 9 до 8), чтобы всегда присутствовать (переходить) слева направо. Я хочу, чтобы прямые переходы (со страницы 9 по 10) отображались справа налево.

Да, моя кнопка управления навигационным контроллером (вверху слева) выглядит так, если вы просматриваете страницу за страницей. Однако, если вы переходите из Индекса, то функция back на контроллере nav вернет вас к индексу.

Моя цель состоит в том, что если пользователь перескакивает на страницу 9 (например) из индекса, затем выполняет правильную выборку, он будет перемещать страницу вправо и показывать страницу 8. Как только на странице 8, если они щелкнут влево страница будет отброшена влево, и они снова будут на странице 9.

Все мои ViewController по умолчанию отображаются с помощью перемещения справа налево.

Пример: Подумайте об этом, как о книге, если я использую Индекс, чтобы перейти к главе 4, затем проведите пальцем вправо и вытащите представление из стека, я вернусь к Индексу. Но если вы находитесь в главе 4, стр. 394, и вы садитесь вправо, вы не хотите возвращаться к индексу! Вы хотите перейти на последнюю страницу главы 3, стр. 393! Таким образом, стек nav не помогает мне.

Пример конца

Подробнее: 1. Я использую новый Xcode "Show" при нажатии кнопки для переключения между ViewControllers.

  1. Я использую контроллер навигации для левой кнопки "Назад". Это использует навигационный стек и отлично работает.

  2. Однако у меня есть собственный собственный навигационный бар внизу (кнопка "Назад", кнопка "Главная", "указатель", кнопка "вперед" ) и жесты. Это то, что я хочу иметь с книжными функциями.

  3. Кодирование быстро.

  4. Работа с Xcode 6.3

Я прочитал, что есть код анимации. Я читал там углубленные программные переходы, которые можно использовать. Просто кажется безумным, что нет простого способа просто выбрать сегменты, которые я хочу представить слева, и легко отменить анимацию.

Спасибо!

Ловушка попытки:

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

Эта ошибка возвращается, когда я вставляю код DCDC в IBAction для моего back-swipe

This error is returned when I insert DCDC's code into an IBAction for my back-swipe

4b9b3361

Ответ 1

Вот как я достигаю эффекта, не требуя навигационного контроллера. Вместо этого попробуйте:

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

Swift 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"

Ответ 2

Вот класс пользовательского сегмента, который вы можете использовать для выполнения разделения слева направо в Swift. Он требует рамки QuartzCore и минимальной анимации.

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

}

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

Кнопка "Назад" по-прежнему будет отображаться на панели навигации на контроллере с переходом, но вы можете легко отключить/настроить навигационный контроллер для этого контроллера представления.

Ответ 3

Обновленный принятый ответ в Swift 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)
            }
        )
    }
}

Ответ 4

Вы можете использовать предопределенный тип перехода в методе переходаWithView

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

Я думаю .TransitionFlipFromLeft - это желаемый

Чтобы выполнить задачу, перетащите новый контроллер представления в свою раскадровку и назовите его некоторым id. Это будет предназначение перехода.

затем создайте экземпляр этого контроллера представления из кода

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

Вы можете сделать это либо внутри IBAction, либо, например, в ViewDidLoad, но, вероятно, IBAction станет лучшим выбором. Обратите внимание, чтобы ввести правильные идентификаторы как для раскадровки, так и для контроллера просмотра. Кроме того, вы должны объявить свой экземпляр appDelegate. Вот реализованный 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/

Ответ 5

Похоже, вы просто пытаетесь вытащить контроллер вида из стека UINavigationController, точно так же, как кнопка возврата по умолчанию.

Вы можете сделать одну из двух вещей. Самое простое - связать свою пользовательскую кнопку возврата с IBAction, которая вызывает popViewControllerAnimated():

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

Или вы можете создать развернуть segue со своего второго контроллера представлений до вашего первого.

Ответ 6

Принятый ответ обновлен для Swift 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)
        }
    }
}

Ответ 7

В моем случае я использовал меню боковой панели...

Я создал новый контроллер представления и два таможенных режима

ОТКРЫТЬ МЕНЮ:

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

Надеюсь, это помогло вам...

Ответ 8

Сейг справа. Вы можете переопределить функцию выполнения в segue, как показано ниже. поместите эту функцию в пользовательский класс 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)
                                }            }
    )
}

если вы хотите, чтобы segue слева, используйте этот

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

Ответ 9

Привет, парень, у меня есть полное решение, просто скопируйте и пропустите этот код, написанный быстро.

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

Примечание. Измените имя вашего ViewController с текстом "MyAccountViewController".