2011-11-28 31 views
9

Tengo una barra de herramientas en la parte superior de mi vista con un botón Atrás. Me gustaría que la vista cargue para aparecer con la barra de herramientas oculta y luego, con un toque del botón, aparezca animado.iPhone: ocultar/mostrar la barra de herramientas

- Editar - No estoy usando un controlador de navegación.

+2

'[self.navigationController setToolbarHidden: SÍ];' – Kjuly

+0

UIView tiene una propiedad [escondido] (http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/UIView/ UIView.html # // apple_ref/occ/instp/UIView/hidden) – beryllium

+0

No estoy seguro de por qué votaron esta pregunta a -1. Lo voté de nuevo porque estoy intentando lo mismo sin NavigationController (aunque eso debería mencionarse en la pregunta). –

Respuesta

7

dado nueva información - que no hay UINavigationController - las cosas son diferentes. Aquí están los bits correspondientes de mi código ...

Crear la barra de navegación y añadirla a la vista:

// Create the navigation bar 

self.navBar = [[UINavigationBar alloc] init]; 
[self.view addSubview:self.navBar]; 

ponerlo hacia fuera ..

- (CGRect)frameForOrientation:(UIInterfaceOrientation)theOrientation 
{ 
    UIScreen *screen = [UIScreen mainScreen]; 
    CGRect fullScreenRect = screen.bounds;  // always implicitly in Portrait orientation. 
    CGRect appFrame = screen.applicationFrame; 

    // Find status bar height by checking which dimension of the applicationFrame is narrower than screen bounds. 
    // Little bit ugly looking, but it'll still work even if they change the status bar height in future. 
    float statusBarHeight = MAX((fullScreenRect.size.width - appFrame.size.width), (fullScreenRect.size.height - appFrame.size.height)); 

    // Initially assume portrait orientation. 
    float width = fullScreenRect.size.width; 
    float height = fullScreenRect.size.height; 

    // Correct for orientation. 
    if (UIInterfaceOrientationIsLandscape(theOrientation)) { 
     width = fullScreenRect.size.height; 
     height = fullScreenRect.size.width; 
    } 

    // Account for status bar, which always subtracts from the height (since it's always at the top of the screen). 
    height -= statusBarHeight; 

    return CGRectMake(0, statusBarHeight, width, height); 
} 

- (CGSize)viewSizeForOrientation:(UIInterfaceOrientation)theOrientation 
{ 
    CGRect frame = [self frameForOrientation:theOrientation]; 
    return CGSizeMake(frame.size.width, frame.size.height); 
} 

- (void)layoutSubviewsForInterfaceOrientation:(UIInterfaceOrientation)theOrientation withAnimation:(BOOL)animate 
{ 
    CGSize fullSize = [self viewSizeForOrientation:theOrientation]; 
    float width = fullSize.width; 
    float height = fullSize.height; 

    CGRect newFrame = CGRectMake(0, 0, width, height); 
    SubViewController *controller; 
    UIView *theView; 

    // Place the navigation bar 

    CGRect navBarFrame = newFrame; 
    navBarFrame.size.height = NAVBARHEIGHT; 
    self.navBar.frame = navBarFrame; 
} 

crear una función para que se it/ocultarlo:

- (void)showNavigationBar:(BOOL)show 
{ 
    if (show == YES && self.navBar.hidden == YES) { 

     // Move the frame out of sight 
     CGRect frame = self.navBar.frame; 
     frame.origin.y = -frame.size.height; 
     self.navBar.frame = frame; 

     // Display it nicely 
     self.navBar.hidden = NO; 
     frame.origin.y = 0.0; 
     [self.view bringSubviewToFront:self.navBar]; 

     [UIView animateWithDuration:0.3 
         animations:^(void) { 
          self.navBar.frame = frame; 
         } 
     ]; 
    } 
    else if (show == NO && self.navBar.hidden == NO) { 

     CGRect frame = self.navBar.frame; 

     // Display it nicely 
     frame.origin.y = -frame.size.height; 
     [self.view bringSubviewToFront:self.navBar]; 

     [UIView animateWithDuration:0.3 
         animations:^(void) { 
          self.navBar.frame = frame; 
         } 
         completion:^(BOOL finished) { 
          self.navBar.hidden = YES; 
         } 
     ]; 
    } 
} 

donde

#define NAVBARHEIGHT 44 
11

Antes se muestra la vista:

[self.navigationController setToolbarHidden:YES]; 

Cuando se pulsa el botón:

[self.navigationController setToolbarHidden:NO]; 
+0

He puesto una barra de herramientas en un controlador de vista y no en un controlador de navegación. ¿Hay alguna manera de hacer que las cosas funcionen o debo usar legítimamente un cotroller de navegación? –

+0

Ver mi otra respuesta – tarmes

1

Aquí hay parte del código de Tarmes portado a MonoTouch/C#.

public static RectangleF FrameForOrientation(UIInterfaceOrientation orientation) { 
     var screen = UIScreen.MainScreen; 
     var fullScreenRect = screen.Bounds;  // always implicitly in Portrait orientation. 
     var appFrame = screen.ApplicationFrame; 

     // Find status bar height by checking which dimension of the applicationFrame is narrower than screen bounds. 
     // Little bit ugly looking, but it'll still work even if they change the status bar height in future. 
     var statusBarHeight = Math.Max((fullScreenRect.Width - appFrame.Width), (fullScreenRect.Height- appFrame.Height)); 

     // Initially assume portrait orientation. 
     var width = fullScreenRect.Width; 
     var height = fullScreenRect.Height; 

     // Correct for orientation. 
     if (IsLandscapeOrientation(orientation)) { 
      width = fullScreenRect.Height; 
      height = fullScreenRect.Width; 
     } 

     // Account for status bar, which always subtracts from the height (since it's always at the top of the screen). 
     height -= statusBarHeight; 

     return new RectangleF(0, statusBarHeight, width, height); 
    } 

    public static SizeF SizeForOrientation(UIInterfaceOrientation orientation) { 
     var frame = FrameForOrientation(orientation); 
     return new SizeF(frame.Width, frame.Height); 
    } 


    public static bool IsLandscapeOrientation(UIInterfaceOrientation orientation) { 
     return 
      orientation == UIInterfaceOrientation.LandscapeLeft || 
      orientation == UIInterfaceOrientation.LandscapeRight; 
    } 
Cuestiones relacionadas