ios swift xcode6 segue uiviewanimation

iOS Segue-De izquierda a derecha-



swift xcode6 (11)

He leído las otras publicaciones en segues pero ninguna soluciona mi pregunta.

En pocas palabras, mis ViewController s están ordenados, como un libro. Quiero que las transiciones hacia atrás (por ejemplo: de la página 9 a la 8) siempre estén presentes (deslizarse) de izquierda a derecha. Quiero que las transiciones hacia adelante (de la página 9 a 10) se presenten de derecha a izquierda.

Sí, mi botón de retroceso del navegador de navegación (arriba a la izquierda) se presenta así si está navegando página por página. Sin embargo, si ingresa desde un índice, la función de respaldo en el controlador de navegación lo lleva de vuelta al índice.

Mi objetivo es que si un usuario salta a la página 9 (por ejemplo) de un índice, luego deslice hacia la derecha, la página se desplace hacia la derecha y se muestre la página 8. Una vez en la página 8, si se desplazan hacia la izquierda, la página salte a la izquierda y estarán en la página 9 nuevamente.

Todos mis ViewController s están, por defecto, presentando deslizando de derecha a izquierda.

Ejemplo: Piénselo como un libro, si uso el índice para saltar al capítulo 4, luego deslizo hacia la derecha y saco una vista de la pila, volveré al índice. Pero si estás en el Capítulo 4, página 394 y deslizas hacia la derecha, ¡no quieres volver al índice! ¡Quieres ir a la última página del capítulo 3, página 393! Entonces la pila de navegación no es de ayuda para mí.

Fin del ejemplo

Detalles: 1. Estoy usando el nuevo Xcode "Mostrar" en el botón-toque para alternar entre ViewControllers.

  1. Estoy usando un controlador de navegación para la funcionalidad del botón "Atrás" de la parte superior izquierda. Esto usa la pila de navegación y funciona bien.

  2. Sin embargo, tengo mi propia barra de navegación personalizada en la parte inferior (botón Atrás, botón de inicio, botón de índice, botón de avance) y gestos. Con esto quiero tener funcionalidad de libro.

  3. Codificando a la velocidad

  4. Trabajando con Xcode 6.3

He leído que hay un código de animación. He leído que hay transiciones de programación en profundidad que se pueden usar. Parece una locura que no haya una manera sencilla de seleccionar los segmentos que quiero presentar desde la izquierda y revertir fácilmente la animación.

¡Gracias!

Intento de registro:

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

Este error se devuelve cuando inserto el código de DCDC en un IBAction para mi IBAction hacia atrás


Aquí hay una clase de segregación personalizada que puede usar para realizar una transición de izquierda a derecha en Swift. Requiere marco QuartzCore y animación mínima.

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

El botón "Atrás" seguirá apareciendo en la barra de navegación en el controlador de vista en transición, pero puede deshabilitar / configurar fácilmente el controlador de navegación para ese controlador de vista.


Así es como logro el efecto sin requerir un controlador de navegación. Pruebe esto en su lugar:

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

Luego, en el guión gráfico, haz clic en la transición que quieras cambiar. En el inspector de atributos, cambie el tipo a ''Personalizar'' y cambie la clase a ''SegueFromLeft''


En mi caso solía hacer un menú de la barra lateral ...

Creé un nuevo controlador de vista y dos pasos de aduanas

PARA ABRIR EL MENÚ:

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

PARA CERRAR EL MENÚ:

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

Espero que te haya ayudado ...


Hola chico, tengo una solución completa solo copie y pase este código escrito rápido 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) }

Nota: Cambie el nombre de su ViewController con el texto "MyAccountViewController".


Para crear un "botón de retroceso" como animación, use esto.

class SegueRightToLeft: 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/2, y: 0) //slice the x axis translation in half 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) } }


Parece que estás tratando de sacar un controlador de vista de la pila de UINavigationController, al igual que el botón de retroceso predeterminado.

Puedes hacer una de las dos cosas. Lo más fácil es conectar su botón Atrás personalizado a un IBAction que llama a popViewControllerAnimated ():

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

O puede crear un segue de desenrollado desde su segundo controlador de vista al primero.


Puede usar el tipo de transición predeclarado en el método transitionWithView

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

Creo que .TransitionFlipFromLeft es el deseado

Para completar la tarea, arrastre un nuevo controlador de vista a su guión gráfico y asígnele un nombre con alguna identificación. Este va a ser el destino de la transición.

luego crea una instancia de este controlador de vista desde el código

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

Puede hacer esto dentro de IBAction o, por ejemplo, en ViewDidLoad, pero probablemente IBAction sea la mejor opción. Preste atención para escribir los identificadores correctos para el guión gráfico y el controlador de vista. Además, debes declarar tu instancia de appDelegate. Aquí está el IBAction implementado

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

Si esto no es lo que esperaba, probablemente desee hacer una animación personalizada. Este artículo es realmente útil: http://mathewsanders.com/animated-transitions-in-swift/


Respuesta aceptada actualizada en 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) } ) } }


Se actualizó la respuesta aceptada a Swift 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) }) } }

Siéntase libre de copiar esto en la respuesta aceptada y eliminar este comentario. (Es una actualización directa, nada nuevo).


Segue from right. Puede anular la función perform en segue como a continuación. ponga esta función dentro de una clase de segue personalizada y asigne esta clase al segue. funcionará para ambos controladores con controlador de navegación y sin controlador de navegación

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

si quieres la transición desde la izquierda, utiliza esto

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


Respuesta aceptada actualizada para Swift 3 (a partir de junio de 2017)

Segue de izquierda a derecha

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

Segue de derecha a izquierda

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