2011-11-28 40 views
9

Ho una barra degli strumenti nella parte superiore della mia vista con un pulsante Indietro. Vorrei quando la vista viene caricata per apparire con la barra degli strumenti nascosta e quindi, con un tocco del pulsante, per apparire animata.iPhone: nascondere/mostrare la barra degli strumenti

--Modifica-- Non utilizzo un controller di navigazione.

+2

'[self.navigationController setToolbarHidden: YES];' – Kjuly

+0

UIView ha una proprietà [nascosta] (http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/UIView/ UIView.html # // apple_ref/occ/instp/UIView/hidden) – beryllium

+0

Non sono sicuro del motivo per cui questa domanda è stata votata a -1. Ho votato il backup poiché sto provando la stessa cosa senza NavigationController (anche se questo dovrebbe essere menzionato nella domanda). –

risposta

7

Dato nuove informazioni - che non c'è UINavigationController - le cose sono diverse. Qui ci sono i bit rilevanti dal mio codice ...

Crea la barra di navigazione e aggiungerlo alla vostra vista:

// Create the navigation bar 

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

stenderlo ..

- (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; 
} 

creare una funzione a chi it/nasconderlo:

- (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; 
         } 
     ]; 
    } 
} 

dove

#define NAVBARHEIGHT 44 
11

Prima la vista viene mostrato:

[self.navigationController setToolbarHidden:YES]; 

Quando si preme il tasto:

[self.navigationController setToolbarHidden:NO]; 
+0

Ho inserito una barra degli strumenti in un controller di visualizzazione e non in un controller di navigazione. C'è un modo per far funzionare le cose o devo usare in modo imparziale un cotroller di navigazione? –

+0

Vedi la mia altra risposta – tarmes

1

Ecco alcuni codici di tarmes portati su 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; 
    } 
Problemi correlati