resetear olvido los hard formatear contraseña con como botones bloqueado ios ios5 uinavigationitem uiappearance

ios - olvido - como resetear un ipod touch



Tamaño de botón trasero de iOS 5 (2)

Estoy usando el protocolo iOS 5 UIAppearance para usar un botón de barra de navegación personalizado como se ve aquí . A diferencia de otros métodos que he encontrado, este es el mejor ya que conserva las animaciones y los comportamientos predeterminados del botón de retroceso.

El único problema es que no puedo cambiar su tamaño ni configurarlo para que no muestre las subvistas . Esto es lo que está pasando:

A es el comportamiento previsto, B es el estilo predeterminado, C es el resultado recortado.

Desafortunadamente, no es tan fácil como configurar UIBarButtonItem a clipsToBounds = NO.

¿Alguien sabe cómo resolver este problema? ¡Gracias!


Como ha descubierto, los proxies de UIAppearance no le permiten ajustar las dimensiones del botón en sí: la lista de métodos de apariencia admitidos para UIBarButtonItem se proporciona en la documentación, y aunque incluye métricas para la etiqueta del título, el botón está desactivado. límites.

Por lo que vale, el botón en sí es en realidad 44 pts (88 píxeles, si estás en la retina) alto en términos de área táctil, es solo que el botón gráfico es más pequeño que eso.

Si no está seguro de lo que equivale a una diferencia de 3 puntos de alto, entonces la mejor opción probablemente sea crear su propio botón personalizado y usar el método UINavigationItem setLeftBarButtonItem . Como usted señala, necesitará implementar un método corto adjunto a ese botón que implementa popNavigationController para asegurar que el comportamiento correcto permanezca.

Actualización : Acabo de descubrir que si mantienes el botón Atrás puedes, de hecho, animarlo para que se deslice de forma similar a un botón estándar. En el siguiente código, self.backButton es el UIButton que UIButton utilizado en tu método initWithCustomView UIBarButtonItem .

- (void)viewWillDisappear:(BOOL)animated { [UIView animateWithDuration:0.3 animations:^{ self.backButton.frame = CGRectMake(self.backButton.frame.origin.x+100, self.backButton.frame.origin.y, self.backButton.frame.size.width, self.backButton.frame.size.height); }]; }

... esto se activará cada vez que desaparece el controlador de vista (es decir, cuando aparece y se presiona), pero puede conectarse al delegado de UINavigationController para que solo se active cuando el controlador de navegación UINavigationController . Definitivamente parece mover el botón cuando se presiona el controlador, aunque solo lo he probado en el simulador.


Terminé usando una clase de controlador de vista personalizada para cada VC que estoy usando en mi controlador de navegación.

OEViewController.h

#import <UIKit/UIKit.h> #import "OEBarButtonItem.h" @interface OEViewController : UIViewController @property (nonatomic, retain) UIButton *backButton; @property (atomic) BOOL pushed; - (void)pushViewController:(UIViewController*)vc; @end

OEViewController.m

#import "OEViewController.h" #define ANIMATION_DURATION 0.33 @implementation OEViewController @synthesize backButton, pushed; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; return self; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. pushed=YES; self.navigationItem.hidesBackButton = YES; backButton = [OEBarButtonItem backButtonWithTitle:[(UIViewController*)[self.navigationController.viewControllers objectAtIndex:[self.navigationController.viewControllers count]-2] title]]; [backButton addTarget:self action:@selector(backButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait); } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (pushed) { self.backButton.frame = CGRectMake(self.backButton.frame.origin.x+100, self.backButton.frame.origin.y+6, self.backButton.frame.size.width, self.backButton.frame.size.height); [UIView animateWithDuration:ANIMATION_DURATION animations:^{ self.backButton.frame = CGRectMake(self.backButton.frame.origin.x-100, self.backButton.frame.origin.y, self.backButton.frame.size.width, self.backButton.frame.size.height); }]; pushed=NO; } else { self.backButton.frame = CGRectMake(self.backButton.frame.origin.x-100, self.backButton.frame.origin.y, self.backButton.frame.size.width, self.backButton.frame.size.height); [UIView animateWithDuration:ANIMATION_DURATION animations:^{ self.backButton.frame = CGRectMake(self.backButton.frame.origin.x+100, self.backButton.frame.origin.y, self.backButton.frame.size.width, self.backButton.frame.size.height); }]; } } - (void)backButtonPressed:(id)sender { [self.navigationController popViewControllerAnimated:YES]; [UIView animateWithDuration:ANIMATION_DURATION animations:^{ self.backButton.frame = CGRectMake(self.backButton.frame.origin.x+100, self.backButton.frame.origin.y, self.backButton.frame.size.width, self.backButton.frame.size.height); }]; } - (void)pushViewController:(UIViewController*)vc { [self.navigationController pushViewController:vc animated:YES]; [UIView animateWithDuration:ANIMATION_DURATION animations:^{ self.backButton.frame = CGRectMake(self.backButton.frame.origin.x-100, self.backButton.frame.origin.y, self.backButton.frame.size.width, self.backButton.frame.size.height); }]; } @end

Esto tiene la ventaja adicional de trabajar con iOS 4.0+ en lugar de usar UIAppearance.

¡Gracias a @lxt por su ayuda!