custom bar iphone ios objective-c uinavigationcontroller

iphone - custom navigation bar swift



iOS 7 Botón Atrás Pop Gesture (7)

¿Qué hiciste en "navegar"?

Utilice este método como este:

- (void)navigateBack { [self.navigationController popViewControllerAnimated:YES]; }

En iOS 7 está el nuevo gesto de deslizar para hacer estallar: pasas de izquierda a derecha en el lado izquierdo de la pantalla y el UINavigationController regresa al UIViewController anterior.

Cuando creo un botón de retroceso personalizado como este, el deslizar hacia gestos emergentes ya no funciona:

UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@" " style:UIBarButtonItemStyleBordered target:self action:@selector(navigateBack)]; [customBackButton setBackButtonBackgroundImage:barBackBtnImg forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [customBackButton setBackButtonBackgroundImage:barBackBtnImgHighlighted forBarMetrics:UIBarMetricsDefault]; self.navigationItem.backBarButtonItem = customBackButton;

¿Cómo puedo usar un botón de retroceso personalizado y tener el movimiento nativo para deslizar el gesto?

Actualizar:

Eso es lo que está sucediendo en navegar .

- (void)navigateBack { [self.navigationController popViewControllerAnimated:YES]; }


Hay un nuevo reconocedor de gestos UIScreenEdgePanGestureRecognizer . Puede agregarlo a su vista y manejarlo respectivamente (llamada navigationBack), replicando el comportamiento de navegación de los controladores de vista.


No es necesario añadir tu propio reconocedor de gestos. El UINavigationController ya lo hace por ti. Debe establecer el delegado para el interactivePopGestureRecognizer antes de habilitarlo.

Haga las siguientes dos cosas:

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self; [self.navigationController.interactivePopGestureRecognizer setEnabled:YES];


Para evitar bloqueos, debe tener cuidado al agregar y eliminar su selector de respaldo personalizado. La razón es que el controlador de navegación permanece alrededor mientras presiona el controlador de apertura. Como ya se indicó después de agregar su botón de retroceso personalizado + selector, debe hacer lo siguiente en viewDidApear.

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enabled = YES; self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self; [self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(navigateBack)]; }

Entonces, a la vista, vamos a dejar de hacer

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { [self.navigationController.interactivePopGestureRecognizer removeTarget:self action:@selector(performCompletion)]; }

El momento de estas llamadas es una clave. De lo contrario, puede tener fallos, consulte más detalles sobre el motivo here


Solo agregue la siguiente línea de código:

[self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(handleGesture:)];

Puede agregar su propio UIGestureRecognizer y abrir UIViewController usted mismo. Consulte la docs para más información.


intente agregar esto en el botón de retroceso personalizado self.navigationController.interactivePopGestureRecognizer.delegate = (id) self;


yo suelo

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"nav_back.png"]]; [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"nav_back.png"]]; [UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -64) forBarMetrics:UIBarMetricsDefault];