ver significado recuperar pantalla notificaciones iconos historial funciona como centro borradas bloqueada ios swift swift2 segue

significado - Cómo presentar el controlador de vista de derecha a izquierda en iOS usando Swift



significado de iconos de iphone (12)

Si desea utilizar el método de "transferencia rápida" CATransition ...

class AA: UIViewController func goToBB { let bb = .. instantiateViewcontroller, storyboard etc .. as! AlreadyOnboardLogin let tr = CATransition() tr.duration = 0.25 tr.type = kCATransitionMoveIn // use "MoveIn" here tr.subtype = kCATransitionFromRight view.window!.layer.add(tr, forKey: kCATransition) present(bb, animated: false) bb.delegate, etc = set any other needed values }

y entonces ...

func dismissingBB() { let tr = CATransition() tr.duration = 0.25 tr.type = kCATransitionReveal // use "Reveal" here tr.subtype = kCATransitionFromLeft view.window!.layer.add(tr, forKey: kCATransition) dismiss(self) .. or dismiss(bb), or whatever }

Desafortunadamente, todo esto no es realmente correcto :(

CATransition realmente no está hecho para hacer este trabajo.

Tenga en cuenta que obtendrá el molesto fundido cruzado en negro que lamentablemente arruina el efecto.

A muchos desarrolladores (como yo) realmente no les gusta usar NavigationController . A menudo, es más flexible simplemente presentar de manera ad-hoc a medida que avanza, particularmente para aplicaciones inusuales y complejas. Sin embargo, no es difícil "agregar" un controlador de navegación.

  1. simplemente en el guión gráfico, vaya a la entrada VC y haga clic en "incrustar -> en el controlador de navegación". Realmente eso es todo. O,

  2. en didFinishLaunchingWithOptions es fácil construir su controlador de navegación si lo prefiere

  3. realmente ni siquiera necesita mantener la variable en ningún lado, ya que .navigationController siempre está disponible como una propiedad, fácil.

Realmente, una vez que tienes un NavigationController, es trivial hacer transiciones entre pantallas,

let nextScreen = instantiateViewController etc as! NextScreen navigationController? .pushViewController(nextScreen, animated: true)

y puedes pop

Sin embargo, eso solo le da el efecto estándar de "doble empuje" de Apple ...

(El viejo se desliza a una velocidad menor, mientras que el nuevo se desliza).

En general y sorprendentemente, generalmente debe hacer el esfuerzo de hacer una transición personalizada completa.

Incluso si solo desea la transición más simple, más común, de desplazamiento / desactivación, debe realizar una transición personalizada completa.

Afortunadamente, para hacer eso hay algo de código de corte y pegado en este QA ... https://stackoverflow.com/a/48081504/294884 . Feliz año nuevo 2018!

Estoy usando presentViewController para presentar una nueva pantalla

let dashboardWorkout = DashboardWorkoutViewController() presentViewController(dashboardWorkout, animated: true, completion: nil)

Esto presenta una nueva pantalla de abajo hacia arriba, pero quiero que se presente de derecha a izquierda sin usar UINavigationController .

Estoy usando Xib en lugar de storyboard, ¿cómo puedo hacer eso?


Código completo para presentar / despedir, Swift 3

extension UIViewController { func presentDetail(_ viewControllerToPresent: UIViewController) { let transition = CATransition() transition.duration = 0.25 transition.type = kCATransitionPush transition.subtype = kCATransitionFromRight self.view.window!.layer.add(transition, forKey: kCATransition) present(viewControllerToPresent, animated: false) } func dismissDetail() { let transition = CATransition() transition.duration = 0.25 transition.type = kCATransitionPush transition.subtype = kCATransitionFromLeft self.view.window!.layer.add(transition, forKey: kCATransition) dismiss(animated: false) } }


Controlador de vista actual de derecha a izquierda en iOS usando Swift

func FrkTransition() { let transition = CATransition() transition.duration = 2 transition.type = kCATransitionPush transitioningLayer.add(transition,forKey: "transition") // Transition to "blue" state transitioningLayer.backgroundColor = UIColor.blue.cgColor transitioningLayer.string = "Blue" }

Referencia por: [ https://developer.apple.com/documentation/quartzcore/catransition][1]


Esto funcionó para mí:

self.navigationController?.pushViewController(controller, animated: true)


Lea todas las respuestas y no puede ver la solución correcta. La forma correcta de hacerlo es hacer un UIViewControllerAnimatedTransition personalizado para el delegado de VC presentado.

Por lo tanto, supone realizar más pasos, pero el resultado es más personalizable y no tiene algunos efectos secundarios, como moverse de la vista junto con la vista presentada.

Por lo tanto, suponga que tiene algo de ViewController, y hay un método para presentar

var presentTransition: UIViewControllerAnimatedTransitioning? var dismissTransition: UIViewControllerAnimatedTransitioning? func showSettings(animated: Bool) { let vc = ... create new vc to present presentTransition = RightToLeftTransition() dismissTransition = LeftToRightTransition() vc.modalPresentationStyle = .custom vc.transitioningDelegate = self present(vc, animated: true, completion: { [weak self] in self?.presentTransition = nil }) }

dismissTransition y dismissTransition se utiliza para animar sus controladores de vista. Entonces UIViewControllerTransitioningDelegate tu ViewController a UIViewControllerTransitioningDelegate :

extension ViewController: UIViewControllerTransitioningDelegate { func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { return presentTransition } func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { return dismissTransition } }

Entonces, el último paso es crear su transición personalizada:

class RightToLeftTransition: NSObject, UIViewControllerAnimatedTransitioning { let duration: TimeInterval = 0.25 func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { return duration } func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { let container = transitionContext.containerView let toView = transitionContext.view(forKey: .to)! container.addSubview(toView) toView.frame.origin = CGPoint(x: toView.frame.width, y: 0) UIView.animate(withDuration: duration, delay: 0, options: .curveEaseOut, animations: { toView.frame.origin = CGPoint(x: 0, y: 0) }, completion: { _ in transitionContext.completeTransition(true) }) } } class LeftToRightTransition: NSObject, UIViewControllerAnimatedTransitioning { let duration: TimeInterval = 0.25 func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { return duration } func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { let container = transitionContext.containerView let fromView = transitionContext.view(forKey: .from)! container.addSubview(fromView) fromView.frame.origin = .zero UIView.animate(withDuration: duration, delay: 0, options: .curveEaseIn, animations: { fromView.frame.origin = CGPoint(x: fromView.frame.width, y: 0) }, completion: { _ in fromView.removeFromSuperview() transitionContext.completeTransition(true) }) } }

En ese controlador de vista de código se presenta sobre el contexto actual, puede hacer sus personalizaciones desde ese punto. También puede ver que UIPresentationController personalizado UIPresentationController es útil (pase usando UIViewControllerTransitioningDelegate )


No importa si es xib o storyboard que está utilizando. Normalmente, la transición de derecha a izquierda se usa cuando empuja un controlador de vista al Controlador de UINavigiationController del UINavigiationController .

ACTUALIZAR

Se agregó la función de temporización kCAMediaTimingFunctionEaseInEaseOut

Proyecto de ejemplo con implementación de Swift 4 agregado a GitHub


Swift 3 y 4.2

let transition = CATransition() transition.duration = 0.5 transition.type = CATransitionType.push transition.subtype = CATransitionSubtype.fromRight transition.timingFunction = CAMediaTimingFunction(name:CAMediaTimingFunctionName.easeInEaseOut) view.window!.layer.add(transition, forKey: kCATransition) present(dashboardWorkout, animated: false, completion: nil)


ObjC

CATransition *transition = [[CATransition alloc] init]; transition.duration = 0.5; transition.type = kCATransitionPush; transition.subtype = kCATransitionFromRight; [transition setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; [self.view.window.layer addAnimation:transition forKey:kCATransition]; [self presentViewController:dashboardWorkout animated:false completion:nil];


Swift 2.x

let transition = CATransition() transition.duration = 0.5 transition.type = kCATransitionPush transition.subtype = kCATransitionFromRight transition.timingFunction = CAMediaTimingFunction(name:kCAMediaTimingFunctionEaseInEaseOut) view.window!.layer.addAnimation(transition, forKey: kCATransition) presentViewController(dashboardWorkout, animated: false, completion: nil)

Parece que el parámetro animated en el método presentViewController realmente no importa en este caso de transición personalizada. Puede ser de cualquier valor, ya sea true o false .


Prueba esto,

let animation = CATransition() animation.duration = 0.5 animation.type = kCATransitionPush animation.subtype = kCATransitionFromRight animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) vc.view.layer.addAnimation(animation, forKey: "SwitchToView") self.presentViewController(vc, animated: false, completion: nil)

Aquí vc es viewcontroller, dashboardWorkout en su caso.


Prueba esto.

let transition: CATransition = CATransition() transition.duration = 0.3 transition.type = kCATransitionReveal transition.subtype = kCATransitionFromLeft self.view.window!.layer.addAnimation(transition, forKey: nil) self.dismissViewControllerAnimated(false, completion: nil)


También puede usar segue personalizado.

Swift 3

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


Tengo una mejor solución que me ha funcionado si quieres mantener la animación clásica de Apple, sin ver esa transición "negra" que ves usando CATransition (). Simplemente use el método popToViewController.

Puedes buscar el viewController que necesitas en

self.navigationController.viewControllers // Array of VC that contains all VC of current stack

Puede buscar el viewController que necesita buscando su restauraciónIdentificador.

TENGA CUIDADO: por ejemplo, si está navegando a través de 3 controladores de vista, y cuando llega al último desea que aparezca el primero. Perderá, en este caso, la referencia al SEGUNDO controlador de vista efectivo porque el popToViewController lo ha sobrescrito. Por cierto, hay una solución: puede guardar fácilmente antes del controlador popToView, el VC que necesitará más adelante. A mí me funcionó muy bien.


importe UIKit y cree una extensión para UIViewController:

extension UIViewController { func transitionVc(vc: UIViewController, duration: CFTimeInterval, type: CATransitionSubtype) { let customVcTransition = vc let transition = CATransition() transition.duration = duration transition.type = CATransitionType.push transition.subtype = type transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut) view.window!.layer.add(transition, forKey: kCATransition) present(customVcTransition, animated: false, completion: nil) }}

después de una llamada simple:

let vC = YourViewController() transitionVc(vc: vC, duration: 0.5, type: .fromRight)

de izquierda a derecha:

let vC = YourViewController() transitionVc(vc: vC, duration: 0.5, type: .fromleft)

puedes cambiar la duración con tu duración preferida ...


let transition = CATransition() transition.duration = 0.25 transition.type = kCATransitionPush transition.subtype = kCATransitionFromLeft transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) tabBarController?.view.layer.add(transition, forKey: kCATransition) self.navigationController?.popToRootViewController(animated: true)