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.
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.
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.
Codificando a la velocidad
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)
}
}
}