2011-09-01 25 views
7

OK, esta es una extraña. He estado golpeando mi cabeza contra eso por una hora tratando de depurar.UIBarButtonItem con vista personalizada no se muestra después de la primera vista

He creado un UIBarButtonItem con una vista personalizada, que es un UIButton con una imagen 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; 

Se encuentra en mi método - (id)initWithNibName: en una UIViewController extendida

en el primer aspecto de la UIViewController, el botón aparece como normal, y funciona bien. SIN EMBARGO, si presiono a otro controlador de vista y luego regreso, el botón es INVISIBLE.

Incluso cuando es invisible, el botón sigue funcionando. Puedo hacer clic en él, y se comporta normalmente. Sé de hecho que es el UIButton original allí, ya que he hecho rastros en su dirección de memoria y otras propiedades ... su propiedad oculta es FALSA, y su propiedad alfa está configurada en 1.00f

Pensé al principio esto fue quizás un problema de profundidad, pero tengo un código que empuja mi fondo UINavigationBar personalizado hacia atrás en cada ciclo de cuadro, y nada cambia. ver Boletín

Es casi como si la imagen es la liberación o algo detrás de las escenas, pero el puntero en la que también está bien ...

supongo que esto es un capricho dibujo raro que sólo necesito mono con, pero es un problema muy difícil para google.

Cualquier sugerencia sería apreciada.

ACTUALIZACIÓN

Resulta que este es un problema de profundidad. Estoy dibujando un fondo personalizado en drawRect :, y ese código SÍ empuja el fondo personalizado a la parte posterior de la pila de vistas, SIN EMBARGO, este método solo se llama una vez por los métodos de marco privados ... por lo tanto, cuando la barra se vuelve a dibujar después la primera vista, el fondo no se ve obligado a retroceder y por alguna estúpida razón, decide volver a dibujar los botones detrás de él.

Así que en este momento estoy tratando de ver cómo puedo forzar que el fondo se repliegue cada vez que se renderiza UINavigationBar.

+0

Es mejor agregar botones a la barra de navegación en 'viewDidLoad'. Prueba esto primero. Y trate de establecer esa imagen en todos los estados UIButton. – Nekto

+0

Estoy muy contento de haber encontrado esto, estoy pasando por exactamente lo mismo. Las soluciones a continuación no me parecen adecuadas, y son más como pirateos. Pero si te has dado cuenta de esto, me encantaría ver lo que hiciste. – n00shie

Respuesta

2

tratan como esto su fino trabajo 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(SetAsFeatured) forControlEvents:UIControlEventTouchUpInside]; 
    [someButton setBackgroundImage:image forState:UIControlStateNormal]; 
    [someButton setBackgroundImage:hilghtedImage forState:UIControlStateHighlighted]; 
    [someButton setShowsTouchWhenHighlighted:YES]; 
    setAsFeatured = [[UIBarButtonItem alloc] initWithCustomView:someButton]; 
0

Había una vez, he ido a través con el mismo dolor. E implementé following, la solución permanente y que funciona perfectamente ...

btnAdd es un UIButton y puede establecer la ubicación deseada configurando x e y.

- (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... 
    } 
0

Debe intentar con este link. Permite enviar la imagen personalizada hacia atrás cuando hay navegación en el controlador de navegación.

0

Puesto que usted está diciendo que el UINavigationBar está detrás del fondo, se puede utilizar

[UIView bringSubviewToFront:barName]; 

para llevarlo a la parte delantera, o

[UIView sendSubviewToBack:background]; 

para enviar los antecedentes de la parte inferior de la pila de vista.

0

¿Tiene algún efecto llamar setNeedsDisplay? ¿Especialmente con respecto a la actualización en la que está creando un fondo personalizado con drawRect?

setNeedsDisplay generalmente se necesita si necesita actualizar la pantalla a cualquier representación modificada, generalmente a través de cambios en drawRect.

0

En mi caso, utilizo el diseño de automóviles a lo largo de mi aplicación, y escribió un botón personalizado en el que tengo la línea siguiente en el constructor:

button.setTranslatesAutoresizingMaskIntoConstraints(false) 

Cuando traté de utilizar este botón como mi vista personalizada para el UIBarButtonItem no dibujó.

Para abreviar, asegúrese de que translatesAutoResizingMaskIntoConstraints esté configurado en true.

Cuestiones relacionadas