2011-11-28 158 views
9

我有一個工具欄在我的視圖頂部有一個後退按鈕。我希望當視圖加載到隱藏工具欄時出現,然後觸摸按鈕顯示動畫。iPhone:隱藏/顯示工具欄

- 編輯 - 我沒有使用導航控制器。

+2

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

+0

的UIView有一個屬性[隱藏](http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/UIView/ UIView.html#// apple_ref/occ/instp/UIView/hidden) – beryllium

+0

我不確定爲什麼這個問題被投票爲-1。我投票回來了,因爲我試着沒有NavigationController同樣的事情(儘管應該在問題中提到) –

回答

7

賦予了新的信息 - 沒有UINavigationController的 - 事情是不同的。下面是我的代碼中的相關位...

創建導航欄,並將其添加到您的視圖:

// Create the navigation bar 

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

萊出來..

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

創建一個函數誰它/隱藏:

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

其中

#define NAVBARHEIGHT 44 
11

前視圖顯示:

[self.navigationController setToolbarHidden:YES]; 

當你按下按鈕:

[self.navigationController setToolbarHidden:NO]; 
+0

我已經把工具欄放在視圖控制器中,而不是在導航控制器中。有沒有辦法使事情工作,或我應該使用導航cotroller? –

+0

看到我的其他答案 – tarmes

1

下面是一些tarmes的代碼移植到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; 
    }