UIBarButtonItem con vista personalizada que no se muestra después de la primera vista

Bien, esto es extraño. He estado golpeando mi cabeza contra él durante una hora ahora tratando de depurar.

He creado un UIBarButtonItem con una vista personalizada, que es un button UIB con una image asignada. El código es el siguiente

UIButton *btnAdd = [[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 28, 28)] autorelease]; [btnAdd setImage:[UIImage imageNamed:@"btn_add"] forState:UIControlStateNormal]; [btnAdd addTarget:self action:@selector(addBox) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *add = [[UIBarButtonItem alloc] initWithCustomView:btnAdd]; self.navigationItem.rightBarButtonItem = add; 

Está ubicado en mi - (id)initWithNibName: método en un UIViewController extendido

En la PRIMERA aparición del UIViewController, el button aparece como normal y funciona bien. SIN EMBARGO, si presiono hacia otro controller de vista y luego presiono, el button es INVISIBLE.

Incluso cuando es invisible, el button sigue funcionando. Puedo hacer clic en él y se comporta normalmente. Sé de hecho que es el UIB original allí, ya que he hecho rastros en su dirección de memory y otras properties … su propiedad oculta es FALSA, y su propiedad alpha está establecida en 1.00f

Pensé que al principio esto era quizás un problema de profundidad, pero tengo el código que empuja mi background UINavigationBar personalizado en la parte posterior en cada bucle de ttwig, y ​​nada cambia. VER ACTUALIZACIÓN

Es casi como si la image estuviera liberando o algo detrás de escena, pero el puntero en eso también está bien …

Supongo que esta es una extraña peculiaridad del dibujo con la que solo necesito interactuar, pero es un problema muy difícil para google.

Cualquier sugerencia sería apreciada.

ACTUALIZAR

Resulta que esto es un problema de profundidad. Estoy dibujando un background personalizado en drawRect :, y ese código empuja el background personalizado al final de la stack de vista, SIN EMBARGO, este método solo es invocado una vez por los methods de marco privado … por lo tanto, cuando la barra se vuelve a dibujar después la primera vista, el background no se está forzando hacia atrás y, por alguna razón estúpida, decide volver a dibujar los botones detrás de él.

Así que ahora estoy tratando de averiguar cómo puedo forzar el background para ser rechazado cada vez que se renderiza UINavigationBar.

intente me gusta esto su trabajo Fine With Me

  UIImage *image = [UIImage imageNamed:@"btn_set-as-fea.png"]; UIImage *hilghtedImage=[UIImage imageNamed:@"btn_set-as-fea_h.png"]; CGRect frame = CGRectMake(0, 0, image.size.width, image.size.height); UIButton* someButton = [[UIButton alloc] initWithFrame:frame]; [someButton addTarget:self action:@selector(SetAsFeatunetworking) forControlEvents:UIControlEventTouchUpInside]; [someButton setBackgroundImage:image forState:UIControlStateNormal]; [someButton setBackgroundImage:hilghtedImage forState:UIControlStateHighlighted]; [someButton setShowsTouchWhenHighlighted:YES]; setAsFeatunetworking = [[UIBarButtonItem alloc] initWithCustomView:someButton]; 

Una vez, me he ido con el mismo dolor. Y implementé la siguiente, la solución permanente y que funciona perfectamente …

btnAdd es un button UIB y puede establecer la location deseada estableciendo su xey.

  - (void)viewDidLoad { btnAdd = [UIButton buttonWithType:UIButtonTypeCustom]; btnAdd.frame = CGRectMake(250, 6, 61, 30); [btnAdd setImage:[UIImage imageNamed:@"btnAdd.png"] forState:UIControlStateNormal]; btnAdd.backgroundColor = [UIColor clearColor]; [self.navigationController.navigationBar addSubview:btnAdd]; [btnAdd addTarget:self action:@selector(btnAdd_clicked:) forControlEvents: UIControlEventTouchUpInside]; } - (void)viewWillAppear:(BOOL)animated { [btnAdd setHidden:FALSE]; } - (void)viewWillDisappear:(BOOL)animated { [btnAdd setHidden:TRUE]; } - (void) btnAdd_clicked { // Your logic... } 

Deberías probar con este enlace . Permite enviar la image personalizada para retroceder cuando hay alguna navigation en el controller de navigation.

Como dice que UINavigationBar está detrás del background, puede usar

 [UIView bringSubviewToFront:barName]; 

para llevarlo al frente, o

 [UIView sendSubviewToBack:background]; 

para enviar el background al final de la stack de vistas.

¿La llamada a setNeedsDisplay tiene algún efecto? Especialmente con respecto a la actualización en la que está creando un background personalizado con drawRect ?

Normalmente, se necesita setNeedsDisplay si necesita actualizar la visualización a cualquier representación modificada, normalmente a través de cambios a drawRect .

En mi caso, uso el layout automático en toda mi aplicación y escribí un button personalizado donde tengo la siguiente línea en el constructor:

 button.setTranslatesAutoresizingMaskIntoConstraints(false) 

Cuando intenté usar este button como mi vista personalizada para UIBarButtonItem , no UIBarButtonItem .

Larga historia corta, asegúrese de que translatesAutoResizingMaskIntoConstraints se establece en true .