uinavigationcontroller ios7 pushviewcontroller xcode5

uinavigationcontroller - La vista ios 7 con contenido transparente se superpone a la vista anterior



ios7 pushviewcontroller (9)

Recientemente actualicé mi proyecto xcode para trabajar con iOS 7, pero me enfrenté a un gran problema. Como toda mi aplicación tiene una sola imagen de fondo (UIImageView agregado a la ventana clave) y todas las vistas son transparentes, tengo un problema al presionar UIViewController, porque el controlador de vista desplazada se superpone a la vista anterior (puede verlo en la imagen aquí: http: / /grab.by/qp0k ). Puedo predecir que esto se debe a que en iOS 7 se ha cambiado la transición de inserción, porque ahora se desliza media pantalla. Tal vez alguien sabe cómo solucionar este problema?

Así es como configuro mis ventanas clave

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; UIImageView *background = [[UIImageView alloc]initWithFrame:[[UIScreen mainScreen] bounds]]; background.image = [UIImage imageNamed:@"background.png"]; UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:self.viewController]; self.window.rootViewContro‌​ller = navi; [self.window makeKeyAndVisible];

Luego, cuando el usuario hace clic en el botón "iniciar entrenamiento", presiono mi siguiente vista como siempre:

workoutView *w = [[workoutView alloc]initWithNibName:@"workoutView" bundle:nil]; [self.navigationController pushViewController:w animated:YES];


Ah, ahora entiendo el problema. Tenías razón, parece ser causado por el UIViewController anterior que no se oculta después de la transición (debido al nuevo efecto de transición).

No parece haber ningún método SDK para controlar este comportamiento. Si no se rediseña la aplicación para no requerir que el fondo sea estático, es probable que deba desplegar su propia navegación. OSNavigationController es una completa reimplementación de UINavigationController que podría ayudarte. Si no se han actualizado a la transición de iOS 7, es probable que esté listo para comenzar. Si lo tienen, siempre puedes usar una versión anterior.


Hice esto.

-(void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; [self.view setAlpha:0]; }

No olvide volver a establecer alfa cuando regrese.

- (void) viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self.view setAlpha:1]; }


Es posible que desee buscar en una nueva característica iOS7 que le permita definir sus propias transiciones UIViewController personalizadas. Consulte en los documentos para UIViewControllerTransitioningDelegate. Además, aquí hay un enlace a un artículo al respecto: http://www.doubleencore.com/2013/09/ios-7-custom-transitions/


Configurar la imagen al color de fondo resolvió el problema:

self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"mainback.png"]];


UINavigationControllerDelegate el problema implementando el nuevo UINavigationControllerDelegate Method animationControllerForOperation .

Por ejemplo:

- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC { PushTransition* transition = [PushTransition new]; [transition setNavigationControllerOperation: operation]; return transition; }

PushTransition es una clase que implementa el protocolo UIViewControllerAnimatedTransitioning y los dos métodos transitionDuration y animateTransition de ese protocolo. Además, he agregado una propiedad para pasar la operación (me dice si se trata de una transición push o pop).

Simplemente ponga el código de animación para mover las vistas a la transición animada de la siguiente manera:

// the containerView is the superview during the animation process. UIView *container = transitionContext.containerView; UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIView *fromView = fromVC.view; UIView *toView = toVC.view; CGFloat containerWidth = container.frame.size.width; // Set the needed frames to animate. CGRect toInitialFrame = [container frame]; CGRect fromDestinationFrame = fromView.frame; if ([self navigationControllerOperation] == UINavigationControllerOperationPush) { toInitialFrame.origin.x = containerWidth; toView.frame = toInitialFrame; fromDestinationFrame.origin.x = -containerWidth; } else if ([self navigationControllerOperation] == UINavigationControllerOperationPop) { toInitialFrame.origin.x = -containerWidth; toView.frame = toInitialFrame; fromDestinationFrame.origin.x = containerWidth; } // Create a screenshot of the toView. UIView *move = [toView snapshotViewAfterScreenUpdates:YES]; move.frame = toView.frame; [container addSubview:move]; [UIView animateWithDuration:TRANSITION_DURATION delay:0 usingSpringWithDamping:1000 initialSpringVelocity:1 options:0 animations:^{ move.frame = container.frame; fromView.frame = fromDestinationFrame; } completion:^(BOOL finished) { if (![[container subviews] containsObject:toView]) { [container addSubview:toView]; } toView.frame = container.frame; [fromView removeFromSuperview]; [move removeFromSuperview]; [transitionContext completeTransition: YES]; }];

lo describió y puedes hacerlo. Además, puede hacer cualquier animación push o pop que desee.


Lo arreglé haciendo esto al inicializar la vista:

self.view.clipsToBounds = YES;


Apoyos a @snoersnoer.

Aquí está el código en Swift 3.

func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { let pushTransition = SUPushTransition() pushTransition.navigationControllerOperation = operation return pushTransition }

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { // the containerView is the superview during the animation process. let container = transitionContext.containerView let fromVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from) let toVC = transitionContext.viewController(forKey:UITransitionContextViewControllerKey.to); if let from = fromVC, let fromView = from.view, let to = toVC, let toView = to.view { let containerWidth = container.frame.size.width // Set the needed frames to animate. var toInitialFrame = container.frame var fromDestinationFrame = fromView.frame if self.navigationControllerOperation == .push { toInitialFrame.origin.x = containerWidth; toView.frame = toInitialFrame; fromDestinationFrame.origin.x = -containerWidth; } else if self.navigationControllerOperation == .pop { toInitialFrame.origin.x = -containerWidth; toView.frame = toInitialFrame; fromDestinationFrame.origin.x = containerWidth; } // Create a screenshot of the toView. if let move = toView.snapshotView(afterScreenUpdates: true) { move.frame = toView.frame container.addSubview(move) UIView.animate(withDuration: Constants.MainPage.navControllerDuration, delay: 0.0, usingSpringWithDamping: 1000, initialSpringVelocity: 1, options: .curveEaseInOut, animations: { move.frame = container.frame; fromView.frame = fromDestinationFrame; }, completion: { (finished) in if finished { if !container.subviews.contains(toView) { container.addSubview(toView) } toView.frame = container.frame fromView.removeFromSuperview() move.removeFromSuperview() transitionContext.completeTransition(true) } }) } } }

Aclamaciones.


Eche un vistazo a la categoría UINavigationController en esa publicación (me solucionó el problema):

https://.com/a/18882232/2826409


Yo tuve el mismo problema. Intenta cargar tu imagen de fondo en el método init. Para mí, funcionó (a veces): por ejemplo:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization self.view.backgroundColor = [UIColor whiteColor]; [self.imageBack setImage:[UIImage imageNamed:@"mayBack.png"]]; } return self; }

Sin embargo, se podían ver destellos ... La mejor solución que encontré, además de implementar el nuevo protocolo de transición iOS7, es implementar una categoría y usar esa categoría siempre que la necesite. Puedes encontrar la respuesta aquí