2012-06-27 8 views
9

estoy usando el fragmento de código de Tito añadir un botón personalizado a mi barra de pestañas: https://github.com/tciuro/CustomTabBarCómo ocultar botón de la barra de pestañas personalizado cuando hidesBottomBarWhenPushed es "TRUE"

(subclases UITabBarController y la adición de un botón personalizado usando

// .. created a UIButton *button 
[self.view addSubview:button]; 

)

Esto funciona muy bien con mi aplicación basada en el guión gráfico, excepto para el caso de una vista secundaria dentro de un controlador de navegación con la opción "oculta la barra inferior de empuje" habilitado. Esto oculta la barra de pestañas según lo prometido, pero no el botón personalizado. Parece que el botón debe agregarse como una subvista a la barra de pestañas. Probé este código feo que ni siquiera hacer que el botón aparezca:

for(UIView *view in self.view.subviews) 
{ 
    if([view isKindOfClass:[UITabBar class]]) 
    { 
     [view addSubview:button]; 
     break; 
    } 
} 

¿Alguna idea?

ACTUALIZACIÓN: Mi solución: En mi ApplicationDelegate i definir los métodos siguientes, que llamo siempre que sea necesario en los métodos viewWillAppear o viewWillDisappear:

-(void)hideCenterButton:(BOOL)animated 
{ 
    if(animated){ 

    [UIView animateWithDuration:0.3 
          delay:0.0f 
         options:UIViewAnimationCurveLinear 
        animations:^{ 
         CGRect frame = self.centerButton.frame; 
         frame.origin.x = -100; 
         self.centerButton.frame = frame; 
        } 
        completion:^(BOOL finished){ 
        }]; 
    } 
} 

-(void)showCenterButton:(BOOL)animated 
{ 
    if(animated){ 

    [UIView animateWithDuration:0.35 
          delay:0.0f 
         options:UIViewAnimationCurveLinear 
        animations:^{ 
         CGRect frame = self.centerButton.frame; 
         frame.origin.x = (self.view.superview.frame.size.width/2) - (self.centerButton.frame.size.width/2); 
         self.centerButton.frame = frame; 
        } 
        completion:^(BOOL finished){ 
        }]; 
    } 
} 

tuviera que definir la duración de la animación a 0,35 s para obtener un efecto suave en armonía con la barra de pestañas.

+0

Oye, 'UIViewAnimationCurveLinear' lanzará una advertencia, en su lugar deberías usar' UIViewAnimationOptionCurveLinear'. – abriggs

+1

Después de algunas pruebas, parece que la opción de animación más natural es 'UIViewAnimationOptionCurveEaseInOut' – abriggs

+0

Probé su código y funciona, pero el botón devuelve detrás de la barra de pestañas, ¿alguna solución a este problema? – xeravim

Respuesta

0

Creo que hay dos formas de conseguir esto.

1) intente colocar el botón en una vista que esté encima del antiguo controlador de vista superior y la barra de pestañas PERO debajo del nuevo controlador de vista superior que se presiona.

2) alejar el botón cuando se presiona el nuevo controlador de vista.

La primera requerirá el borrado con la jerarquía de vista propietaria de iOS que no está documentada, no es compatible y puede cambiar en cualquier momento.

Lo segundo será una cuestión de hacer que la animación parezca lo suficientemente suave para que su usuario no se dé cuenta. No se trata solo de comportarse de manera perfecta, simplemente aparecer adecuadamente.

Yo personalmente recomendaría una animación del botón que desaparece (animar su alfa a 0) y volver a aparecer en función de si su controlador de vista que pasa por la barra de pestañas está apareciendo o desapareciendo.

La animación para una navegación es (creo) 0,3 segundos. Si el botón está en el medio de la barra de pestañas, probablemente lo deseará invisible cuando el controlador de animación en la vista lo alcance (si no antes), por lo que se podría usar algo entre 0,1 y 0,15 segundos para animarlo.

Ahora bien, esto no hace que el botón se comporte exactamente igual que la barra de pestañas, pero con la rapidez de la transición tan corta, será realmente imperceptible para el usuario.

Ahora solo para hacer una pregunta que debe hacerse. ¿Por qué necesita presionar un controlador de vista que se superpone a la barra de pestañas? ¿Por qué es eso más deseable/necesario que presentar un controlador de vista modal? Si puede argumentar enérgicamente, manténgalo y buena suerte, si no es necesario, sin embargo, puede lograr la experiencia que desee con un controlador de vista modal.

+0

Gracias por sus sugerencias. Elegí tu segunda solución al definir dos funciones en mi delegado de aplicaciones. Ver mi actualización – bjoern

+0

Bien hecho, me gusta su solución según mi sugerencia. – NSProgrammer

0

Compruebe this uno para poner un botón en el UITabBar. Vea si funciona después con hidesBottoBarWhenPushed.

+0

gracias, pero eso no ayuda. La solución en https://github.com/tciuro/CustomTabBar es en realidad una extensión del guión gráfico del enlace conocido que publicó. – bjoern

1

Una manera fácil de manejar esto sería crear una instancia del botón en .h de su archivo.

UIButton *customTabButton; 

Al llamar a los cueros barra inferior de empuje establezca la propiedad botón para restablecer ocultos y otra vez en los otros puntos de vista, si la barra inferior es visible.

shareFbButton.hidden=YES; 

se puede comprobar que este es el viewDidLoad de todos los archivos y poner esta línea de código si es necesario para asegurarse de que está mostrando el botón y ocultar el botón en todas las páginas que necesita.

if(self.tabBarController.tabBar.isHidden){ 

// set or reset the custom button visibility here 
} 

Esta es de una manera.

+0

por favor explique cómo, eliminar subvista está molestando a la interfaz de usuario. antes de que se suelte la pantalla, el botón desaparece y se ve mal. Me pregunto cómo las otras aplicaciones están haciendo esto. – carbonr

+0

No estoy seguro de lo que me está preguntando ¿puede por favor reformular la pregunta? – LostPuppy

1

¿Por qué no haces que el botón sea parte del tabbar?

tabBarController.tabBar.addSubView(yourButton) 

todo sería resolver. ¡aclamaciones!

Cuestiones relacionadas